三、Asp.Net MVC4.0开发CMS系统案例之用户登录模块开发

本次开发是将三层架构与MVC结合一起来,我们看下面一个系统结构:

View ->Contraller->Model->BLL->DAL->SQLSERVER

|        |        |

----------->Extensions----->FrameWork

|

__>Common

Extensions包括扩展类功能,例如控件的再重新,权限的重新验证等。Common是一些公共性功能。

第一步:创建用户登录模型,可以与注册模型类(SysComUerRegister),用户模型(SysComUser)写入同一个文件中。

    /// <summary>
    /// 用户登录
    /// </summary>
    ///子类并不映射到任何数据库,加上一个不映射的属性[NotMapped]
    [NotMapped]
    public class SysComUserLogin
    {

        [Display(Name = "登录名", Description = "4-20个字符")]
        [Required(ErrorMessage = "×")]
        [StringLength(20, MinimumLength = 4, ErrorMessage = "×")]
        public string LoginName { get; set; }

        [Display(Name = "登录密码", Description = "6-20个字符")]
        [Required(ErrorMessage = "×")]
        [StringLength(20, MinimumLength = 6, ErrorMessage = "×")]
        [DataType(DataType.Password)]
        public new string Password { get; set; }

        [Display(Name = "验证码", Description = "请输入验证码!")]
        [Required(ErrorMessage = "×")]
        [StringLength(4, MinimumLength = 4, ErrorMessage = "×")]
        public string VerificationCode { get; set; }
    }

第二步:控制器Conrallers方法的实现。这里我们考虑有三个:一个是默认的登录页面方法,一个是HTTPPOST提交登录数据的方法,还有一个注销的方法。如下:

        /// <summary>
        /// 用户登录页面
        /// </summary>
        /// <returns></returns>
        public ActionResult UserLogin()
        {
            return View();
        }

        /// <summary>
        /// 用户提交登录
        /// </summary>
        /// <param name="userLogin"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult UserLogin(SysComUserLogin userLogin)
        {
            //说明:因为在Models中,已经实现用户名和密码验证规则,因为这里不需要重复判断了,但验证码除外,因为它是保存Session缓存中.
            if (String.IsNullOrEmpty(Session["VerificationCode"].ToString()))
            {
                ModelState.AddModelError("VerificationCode", "×");
                return View();
            }
            else if (Session["VerificationCode"].ToString() != userLogin.VerificationCode)
            {
                ModelState.AddModelError("VerificationCode", "×");
                return View();
            }
            else
            {
                if (userRpy.Authentication(userLogin.LoginName,userLogin.Password) == 0)
                {
                    HttpCookie _cookie = new HttpCookie("user");
                    _cookie.Values.Add("loginname", userLogin.LoginName);
                    _cookie.Values.Add("password", userLogin.Password);
                    Response.Cookies.Add(_cookie);
                    ModelState.AddModelError("Message", "登陆成功!!");
                    return View();
                }
                else
                {
                    ModelState.AddModelError("Message", "登陆失败!");
                    return View();

                }
            }

        }

        /// <summary>
        /// 注销登录信息
        /// </summary>
        /// <returns>URL</returns>
        public ActionResult UserLoginOut()
        {
            HttpCookie _cookie = HttpContext.Request.Cookies["user"];
            if (_cookie != null)
            {
                //失效时间
                _cookie.Expires = DateTime.Now.AddHours(-1);
                Response.Cookies.Add(_cookie);
            }
            return View();
        }

这里面用到一个Authentiction()用户身份验证方法,所以需要在BLL业务层实现。

第三步:BLL业务逻辑层方法实现

        /// <summary>
        /// 用户登录身份验证
        /// </summary>
        /// <param name="loginName">登录名</param>
        /// <param name="password">密码</param>
        /// <returns>0:登录成功;1:登录名不存在;2:密码错误</returns>
        public int Authentication(string loginName, string password)
        {
            var _user = HillstoneContext.SysComUser.SingleOrDefault(u=>u.LoginName==loginName);
            if (_user == null) { return 1; }
            if (_user.Password != password) { return 2; }
            return 0;
        }

第四步:所有涉及的东西都写完了,下面就是实现VIEW了。如下:

@model Hillstone.Models.SysComUserLogin

@{
    ViewBag.Title = "用户登录";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>UserLogin</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>SysComUserLogin</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.LoginName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LoginName)
            @Html.ValidationMessageFor(model => model.LoginName)
            @Html.DisplayDescriptionFor(model=>model.LoginName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Password)
        </div>
        <div class="editor-field">
            @Html.PasswordFor(model => model.Password)
            @Html.DisplayDescriptionFor(model => model.LoginName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.VerificationCode)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.VerificationCode)
            @Html.ValidationMessageFor(model => model.VerificationCode)
             <img id="verificationcode"  src="@Url.Action("VerificationCode", "SysComUser")" /> 
             <a id="trydifferent" style="cursor: pointer">换一张</a> 
        </div>

        <p>
            <input type="submit" value="Save" />@Html.ValidationMessage("Message")
        </p>
    </fieldset>
}

<div>

    @Html.ActionLink("Back to List", "Index")
</div>
<script type="text/javascript" >
    function VerificationChange() {
        $("#verificationcode").attr("src", "/SysComUser/VerificationCode?" + new Date());
    }
   
</script>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

第五部:其他考虑,我们登录后,每次页面跳转或者刷新,需要确认身份是否失效或者有效,那么问题就来了,是不是在所有的页面请求Contraller时候都要调用BLL中的Authencation()方法来验证呢?其实系统默认有验证机制类库,我们可以重新写这个接口,使用起来更加简洁方面,提交我们的开发效率。所以我做个扩展,在Extensions文件夹中新建UserAuthorizeAttribute.cs类。如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Hillstone.BLL;

namespace System.Web.Mvc
{
    /// <summary>
    /// 用户权限验证
    /// </summary>
    public class UserAuthorizeAttribute:AuthorizeAttribute
    {
        /// <summary>
        ///  核心【验证用户是否登录】以后只要在需要登录后才能操作的Action或Controller上加[UserAuthorize]就可实现验证是否已经登录了。
        /// </summary>
        /// <param name="httpContext">HTTP请求</param>
        /// <returns>布尔值:True or False</returns>
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext.Request.Cookies["user"] == null) return false;
            HttpCookie _cookie = httpContext.Request.Cookies["user"];

            string _loginName = _cookie["loginname"];
            string _password = _cookie["password"];

            httpContext.Response.Write("登录名:" + _loginName);

            if (string.IsNullOrEmpty(_loginName) || string.IsNullOrEmpty(_password)) return false;

            SysComUserRepository userRsy = new SysComUserRepository();
            if (userRsy.Authentication(_loginName, _password) == 0) return true;
            else return false;
        }
    }
}

继承AuthorizeAttribute类库,这里做AuthorizeCore方法重写,里面调用BLL中的Authencation()登录验证方法。 以后所有需要登录之后才能操作的Contraller中,在Action之前加上[UserAuthorize]即可。

时间: 2024-08-24 04:00:08

三、Asp.Net MVC4.0开发CMS系统案例之用户登录模块开发的相关文章

四、Asp.Net MVC4.0开发CMS系统案例之密码修改模块开发

首先针对上一次的密码登录做一个补充说明,我们知道在控制器方法汇总使用过滤器[UserAuthorize]做为登录验证非常方便,验证是否成功,然后进行页面跳转,如果验证不成功我要给他们设定一个跳转页面,我们需要在config中做如下配置:     <authentication mode="Forms">       <forms loginUrl="~/SysComUser/UserLogin" timeout="2880" /

七、Asp.Net MVC4.0开发CMS系统案例之用户群组模块

群组管理,主要是针对不同人建立不同的群组,这里主要是群组本身管理,至于群组与用户之间的关系,我感觉还是用领一张表建立关系比较好,毕竟他们是多对多的关系.先看代码: 一.模板Models using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Hillstone.Models {     public class 

一、Asp.Net MVC4.0开发CMS系统案例之数据库设计

从本章开始,记录开发一个文章管理系统的过程,一般开发软件的流程无非包括以下几个方面: 1.需求调研,了解系统功能需求目标. 2.分析设计,根据调研内容分析如何实现的客户的要求,并设计系统功能模块. 3.数据设计,确定功能对应的数据库.数据表.数据字段.数据关系等 4.代码开发,实现各个功能模块. 5.整合美工,将后台的业务功能实现与前台设计的网页结合起来,并做好美工优化. 6.系统测试,检查系统BUG,以及性能等测试. 7.上线发布,正式使用. 由于我们主要是为学习和研究MVC架构技术,因此业务

二、Asp.Net MVC4.0开发CMS系统案例之用户注册模块开发

上一节我们建立好数据库与数据表结构之后,接下来我们在vs2012中新建MVC开发项目,默认的文件内容就不讲了,关于MVC基础知识东西可以网上查阅其他,或者阅读我的其他博文中的有关介绍. 一.首先先建立用户的Model模型类. 1)用户信息模型 using System; using System.ComponentModel.DataAnnotations; namespace Hillstone.Models {     public class SysComUser     {       

六、Asp.Net MVC4.0开发CMS系统案例之路由规则修改

今天开放的时候,发现如果我要把生成View视图页csthtml建立多个文件夹目录下面,contraller就找不到了.实际开发工作中,不可能所有生成的视图都放在View下面的一级文件夹下,对于系统的代码管理不是十分科学,于是我就尝试如何让它实现. 比如登录功能,控制器建立的路径为:Contrallers/Sys/Com/UserContraller.cs.如图: 系统添加视图默认生成View的路径为:View/User/UserLogin.cshtml.如果我要把路径改为View/Sys/Com

建筑材料系统 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发

框架介绍: 1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性高.有利软件工程化管理等优点 3.采用WebAPI,客户端完全摆脱了代理和管道来直接进行交互 4.采用EasyUI前台UI界面插件,可轻松的打造出功能丰富并且美观的UI界面 5.采用Knockout,,提供了一个数据模型与用户UI界面进行关联的高层次方式(采用行为驱动开发) 6.数据访问层采用强大的

SNF快速开发平台之BS页面展示和九大优点-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout

一)经过多年的实践不断优化.精心维护.运行稳定.功能完善: 能经得起不同实施策略下客户的折腾,能满足各种情况下客户的复杂需求. 二)编码实现简单易懂.符合设计模式等理念: 上手快,见效快.方便维护,能控制软件项目后期维护风险. 三)有严谨的分层理念.完全符合主流的SOA理念架构: 程序可以采用不同的实施策略.架构需求,方便维护.方便扩展. 四)符合RBAC的权限理念.同时也能满足国内小型软件项目的灵活性需求: 不仅符合国际通用标准,又能满足国内的小型软件项目的灵活设置需求. 五)不仅支持多数据库

Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器

Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器 MVC概念 MVC的含义是 “模型-视图-控制器”.MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类. · Views: 应用程序动态生成 HTML所使用的模板文件. · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板. 本系列教程,我们将覆盖所有这些概念,并告诉

Asp.Net MVC4.0 从入门到精通与项目实战 (Petapoco框架、二维码自定义、Bootstrap视图)视频教程

Asp.Net MVC4.0 从入门到精通与项目实战 (Petapoco框架.二维码自定义.Bootstrap视图)视频教程下载    联系QQ:1026270010 Asp.Net MVC 简介      MVC模式是“Model-View-Controller”的缩写,中文翻译为“模式-视图-控制器”.MVC模式是于20世纪70年代在smaltalk80的GUI设计中被提出的.它包括3个部分:模型(Model).视图(View)和控制器(Controller).MVC模式至今已被广泛使用,A