从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程

 

用户登录与权限验证是网站不可缺少的一部分功能,asp.net MVC4框架内置了用于实现该功能的类库,只需要简单搭建即可完成该功能.

下面详细介绍该功能的完成方法,尾部有实例源码下载,希望可以给刚开始接触MVC的朋友做个参考.

    第一步:给VS安装MVC4框架

VS2012自带MVC4框架,其他版本可以使用独立安装包进行安装,这里就不讨论了,本例使用VS2013创建,.NET4.0+MVC4

第二步:创建MVC4网站项目

        选择文件-新建-项目,按下图示例创建一个空的MVC网站

        

 

    第三步:配置web.config,启用Form验证.

        打开根目录下的web.config,在<system.web>节点下插入一下代码,启用Form验证并指定默认登录页面

<authentication mode="Forms">
      <forms loginUrl="/Home/Login" timeout="2880"/>
</authentication>

第四步:创建所需要文件

本例需要创建以下文件:

Model文件夹下LoginModel.cs

Controllers文件夹下HomeController.cs

View下创建文件下Home,文件夹下创建文件:

Index.cshtml

Login.cshtml

Show.cshtml

Edit.cshtml

Add.cshtml

文件结构如下图所示:

第五步:填充LoginModel代码  

 public class LoginModel
    {
        [Display(Name="用户名")]
        [Required(ErrorMessage="用户名不能为空")]
        public string UserName { get; set; }

        [Display(Name="密码")]
        [Required(ErrorMessage="密码不能为空")]
        [DataType(DataType.Password)]
        [RegularExpression(@"^\w+$", ErrorMessage = "密码格式有误,只能是字母数字或者下划线")]
        public string Password { get; set; }

        [Display(Name="记住登陆?")]
        public bool RememberMe { get; set; }

        public string Login()
        {
            //该方法应从数据库中对比用户名和密码,并取得用户权限列表
            //这里为了简单直接对比字符串并返回权限列表,返回NULL则说明用户名或者密码错误
            //权限列表即为用,分割的权限名称
            string result = null;

            if (this.UserName == "guest" & this.Password == "guest")
                result = "Add";

            if (this.UserName == "admin" & this.Password == "admin")
                result = "Add,Edit";

            return result;
        }
    }

复制上面代码到类中时VS的智能感知会提示你缺少以下命名空间,添加上即可

using System.ComponentModel.DataAnnotations;

    第五步:填充HomeControll代码

public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            ViewBag.Info = "该页面不含权限注解,所有人均可访问.";
            return View();
        }

       [Authorize(Roles = "Edit")] //该注解表示只有包含Edit权限的用户才可以访问
        public ActionResult Edit()
        {
            ViewBag.Info = "该页面需要包含Edit权限的人才可访问.";
            return View();
        }

       [Authorize(Roles = "Add")] //该注解表示只有包含Add权限的用户才可以访问
        public ActionResult Add()
        {
            ViewBag.Info = "该页面需要包含Add权限的人才可访问.";
            return View();
        }

       [Authorize(Roles = "Add,Edit")] //该注解表示只有包含Add权限的用户才可以访问
        public ActionResult Show()
        {
            ViewBag.Info = "该页面需要包含Edit或者Add权限的人才可访问.";
            return View();
        }

       public ActionResult Login(LoginModel model)
       {
           return View();
       }

       [HttpPost] //该注解表示只接收Post数据
       [ValidateAntiForgeryToken]//该注解可以防止跨站攻击
       [ActionName("Login")]//该注解可以更改路由中Action名称
       public ActionResult LoginCheck(LoginModel model)
       {
           if (!ModelState.IsValid)
           {
               //用户输入服务端验证,此处处理验证不通过的提示代码 本例略过
               return View();
           }

           string result = model.Login();

           if (result == null)
           {
               //用户名或者密码不正确的提示代码 本例略过
               return View();
           }
           else
           {
               //用户登陆核心代码
               FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                    1,
                    model.UserName,
                    DateTime.Now,
                    DateTime.Now.AddHours(240),//记住密码的时间
                    model.RememberMe,//是否保存cookie 记住密码
                    result //获取的用户权限列表 用逗号分割的字符串
                    );
               string encryptedTickt = FormsAuthentication.Encrypt(authTicket);
               HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTickt);
               Response.Cookies.Add(authCookie);

               Response.Redirect("/Home", true);
               ActionResult empty = new EmptyResult();
               return empty;
           }
           return View();
       }

复制以上代码,会提示添加以下命名空间:

using ChengChenXu.MVC4_Login_Demo.Models; //项目Model命名空间
using System.Web.Security;

第六步:填充View代码,下面代码仅展示<Body>标签内部的内容,页头没有展示(源码中完全).

        Index.cshtml

     <h1>@ViewBag.Info</h1><br />
        <a href="/home/login">登陆</a><br />
        <p>以下链接 登陆后才可以访问 未登陆时如果点击则会跳转到登陆页</p>
        <a href="/home/add">添加页面</a><br />
        <a href="/home/edit">编辑页面</a><br />
        <a href="/home/show">查看页面</a><br />

Add.cshtml  Edit.cshtml  Show.cshtml 三个文件代码一致

     <h1>@ViewBag.Info</h1>
        <a href="/home">返回</a><br />

Login.cshtml 该文件首先要在顶部添加一行代码,表示是一个强类型View

@model ChengChenXu.MVC4_Login_Demo.Models.LoginModel

页面代码:

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

                @Html.LabelFor(model=>model.UserName)
                @Html.TextBoxFor(model => model.UserName)
                <br />

                @Html.LabelFor(model=>model.Password)
                @Html.PasswordFor(model => model.Password)
                <br />

                @Html.LabelFor(Model=>Model.RememberMe)
                @Html.CheckBoxFor(model=>model.RememberMe)
                <br />

                <input type="submit" class="submit" tabindex="3" value="登录" />

            }

第七步:修改根目录下Global.asax的代码,添加权限处理代码,把下面两个方法复制添加到Global文件即可

     public MvcApplication()
        {
            AuthorizeRequest += new EventHandler(MvcApplication_AuthorizeRequest);
        }

        void MvcApplication_AuthorizeRequest(object sender, EventArgs e)
        {
            var id = Context.User.Identity as FormsIdentity;
            if (id != null && id.IsAuthenticated)
            {
                var roles = id.Ticket.UserData.Split(',');
                Context.User = new GenericPrincipal(id, roles);
            }
        }

复制好后会提示缺少以下命名空间:

using System.Web.Security;
using System.Security.Principal;

 

完成好之后全部实例就完成了,运行以下试试吧.

主页为/Home  无需权限

登录页为/Home/Login  无需权限

添加页为/Home/Add   需要Add权限

展示页为/Home/Show  需要Edit或者Add权限

编辑页为/Home/Edit  需要Edit权限

内置了两个账号 

账号 密码 权限

guest guest "add"  

admin admin "add,edit"

 

运行结果:

如果直接访问除了Home和Login页面之外的页面(需要权限的页面) 则会跳转到Login页面

guest账号可以访问Add Show页面

admin账号可以访问Add Edit Show页面

 

锦上添花:

1 自动跳转到登录页的时候URL会有一个ReturnUrl参数记录跳转前的页面,可以捕捉该页面登录后跳回

2 MVC支持客户端验证,需要js文件支持,这样客户端就不再需要写js代码进行输入验证了.本例不再展示了,请自行搜索.

本博文转自我的博客:http://chengchenxu.com/Article/show/14/  

源码下载:http://chengchenxu.com/ueditor/net/upload/file/20180305/6365584952537468509926479.rar

从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程的更多相关文章

  1. 学习MVC之租房网站(六)-用户登录和权限控制

    在上一篇<学习MVC之租房网站(五)-权限.角色.用户管理>完成了权限.角色.用户的增删改查,现在将基于前面完成的内容,进行后台用户登录和权限控制功能的开发. 一.用户登录 用户登录涉及到 ...

  2. Asp.NET WebApi+Redis实现单用户登录实战演练

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  3. ASP.NET MVC View 和 Web API 的基本权限验证

    ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Mi ...

  4. .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息

    在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...

  5. Java SSH框架系列:用户登录模块的设计与实现思路

    1.简介用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问.二.简单设计及实现本程序是基于Jav ...

  6. ASP.NET MVC4框架揭秘 源代码下载

    http://files.cnblogs.com/artech/asp.net.mvc.4.samples.rar

  7. asp.net MVC4 框架揭秘 读书笔记系列3

    IIS/ASP.net管道 本节全部用图形表示便于理解和记忆 1.3.1 IIS5.x与asp.net 1.3.2 IIS 6.0与asp.net 1.3.3 IIS7.0与asp.net 基于IIS ...

  8. asp.net MVC4 框架揭秘 读书笔记系列2

    1.2 MVC 变体 MVC 是一种Pattern 另外一种说法是ParaDigm 范例 模式和范例的区别在于前者可以应用到具体的应用上,而后者则仅仅提供一些指导方针 1.2.1 MVP Model ...

  9. asp.net MVC4 框架揭秘 读书笔记系列1

    1.1 传统MVC 名词解释 Autonomous View. AV. 自制视图 GUI图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式 ...

随机推荐

  1. kafka default partitioner java版本和scala版本的不同

    scala import kafka.utils._ class DefaultPartitioner(props: VerifiableProperties = null) extends Part ...

  2. openstack核心组件--glance镜像(2)

    一.glance介绍:              Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等. Glance提供Restful API可以查询虚 ...

  3. centos7操作

    一.安装系统 1.下载(Minimal ISO)http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1 ...

  4. k8s 网络模型解析之实践

    一. 实践说明 首先我们先创建一组资源,包括一个deployment和一个service apiVersion: apps/v1 kind: Deployment metadata: name: ng ...

  5. DS1302时钟基础使用(含代码)

    了解其管脚 X1 X2 32.768KHz 晶振管脚 GND 地 RST 复位脚 I/O 数据输入/输出引脚,具有三态 SCLK 串行时钟 Vcc1,Vcc2(备用电源供电) 电源供电管脚 DS130 ...

  6. 资深技术Leader曹乐:如何成为技术大牛

    From: https://mp.weixin.qq.com/s/QaBTm_9AJC01Isr3LLR3aw 原创: 曹乐 公众号: 再成长一次 看了下面这篇文章的话,应该会有收获. 虽然排版不好, ...

  7. Hyperledger Fabric1.4 网络环境搭建步骤

    1.  外部访问虚拟机: 安装ssh apt-get install openssh-server openssh-client 2.  安装vim sudo apt install vim 3.  ...

  8. 将IList、DataTable数据导出到Excel

    /// <summary> /// IList导出Excel /// </summary> /// <typeparam name="T">&l ...

  9. 新建ASPX页面,并练习div布局和table布局

    1,Div水平居中: <div style="margin:0px auto;width:100px;height:100px;background:#FF0000;"> ...

  10. Netty如何支持三种Reactor

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 什么是Reactor及三种版本 反应堆设计模式(Reactor pa ...