从零开始实现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

原文地址:https://www.cnblogs.com/chengchenxu/p/8508373.html

时间: 2024-07-29 05:04:51

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

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

一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和完善此系列课程! 1.1.本高级系列课程适合人群如下: 1.有一定的NET开发基础并对ASP.NET WebApi.Redis.技术有一定了解和认识. 2.喜欢阿笨的干货分享课程的童鞋们. 1.2.一句话总结今天我们要解决的问题? 我们如何实现系统限制一个账号同一时刻只能一个用户账号登录使用(不能同时登录),

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

时间 2014-01-19 16:14:54  CSDN博客原文  http://blog.csdn.net/nupt123456789/article/details/18504615 1.简介 用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问. 二.简单设计及实现 本程序是基于Java的SSH框架进行的. 1.数据库设计 我们应该设计一个用户表,其Userinfo表,对应的SQL语句为(

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

ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Microsoft Visual Studio 2013(MVC 5 + Web API 2) 修改Web.config,增加Forms验证模式,在system.web节点中增加以下配置: <authentication mode="Forms"> <forms loginU

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

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军--将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到了一个问题--如何在asp.net core

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

1.2 MVC 变体 MVC 是一种Pattern 另外一种说法是ParaDigm 范例 模式和范例的区别在于前者可以应用到具体的应用上,而后者则仅仅提供一些指导方针 1.2.1 MVP Model View Presenter 交互图 MVC 模式中元素之间 “混乱”的交互主要体现在允许View 和 Model 绕开Controller进行单独交流,这在MVP 模式中得到了充分解决 PV 模式 (passive View) 解决View很难测试的最好方法是让他无需测试,让UI处理更少逻辑,被动

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 基于IIS6.0与asp.net 双管道设计 基于IIS7.0与asp.net 集成管道设计 1.3.4 asp.net管道

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

1.1 传统MVC 名词解释 Autonomous View. AV. 自制视图 GUI图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面.与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受. SoC seperation of concers 关注点分离(Separation of concerns,SOC)是对只与“特定概念.目标”(关注点)相关联的软件组成部分进行“标识.封装和操纵”

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

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

Asp.net MVC4 记录在线用户数及登录时长

Global.asax.cs文件 public class MvcApplication : System.Web.HttpApplication { /// <summary> /// 全局事件开始 /// </summary> protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configurati