基于FormsAuthentication的用户、角色身份认证(转)

一般情况下,在我们做访问权限管理的时候,会把用户的正确登录后的基本信息保存在Session中,以后用户每次请求页面或接口数据的时候,拿到

Session中存储的用户基本信息,查看比较他有没有登录和能否访问当前页面。

Session的原理,也就是在服务器端生成一个SessionID对应了存储的用户数据,而SessionID存储在Cookie中,客户端以后每次请求都会带上这个

Cookie,服务器端根据Cookie中的SessionID找到存储在服务器端的对应当前用户的数据。

FormsAuthentication是微软提供给我们开发人员使用,做身份认证使用的。通过该认证,我们可以把用户Name 和部分用户数据存储在Cookie中,

通过基本的条件设置可以,很简单的实现基本的身份角色认证。

这里要实现的效果是:在不使用membership的情况下,使用系统提供的Authorize 实现基于角色的访问控制。

1、创建认证信息 Ticket

  在用户登录以后,把用户的ID和对应的角色(多个角色用,分隔),存储在Ticket中。

  使用FormsAuthentication.Encrypt 加密票据。

  把加密后的Ticket 存储在Response Cookie中(客户端js不需要读取到这个Cookie,所以最好设置HttpOnly=True,防止浏览器攻击窃取、伪造Cookie)。这样下次可以从Request Cookie中读取了。

  一个简单的Demo如下:

        public ActionResult Login(string uname)
        {
            if (!string.IsNullOrEmpty(uname))
            {
                //FormsAuthentication.SetAuthCookie(uname,true);
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket
                    (   1,
                        uname,
                        DateTime.Now,
                        DateTime.Now.AddMinutes(20),
                        true,
                        "7,1,8",
                        "/"
                    );
                var cookie = new HttpCookie(FormsAuthentication.FormsCookieName,FormsAuthentication.Encrypt(ticket));
                cookie.HttpOnly = true;
                HttpContext.Response.Cookies.Add(cookie);

                return RedirectToAction("UserPage");
            }
            return RedirectToAction("Index");
        }

这里FormsAuthenticationTicket 第六个参数存储的是string 类型的userData ,这里就存放当前用户的角色ID,以英文逗号分隔。

当使用用户名 “测试” 登录后,客户端就会出现这样一条记录Cookie

2、获取认证信息

登录后,在内容页,我们可以通过,当前请求的User.Identity.Name 获取到uname信息,也可以通过读取Request 中的Cookie 解密,获取到Ticket,再从其中获取uname 和 userData (也就是之前存储的角色ID信息)。

            ViewData["user"]=User.Identity.Name;

            var cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
            var ticket = FormsAuthentication.Decrypt(cookie.Value);
            string role = ticket.UserData;

            ViewData["role"] = role;
            return View();

3、通过注解属性,实现权限访问控制

在web.config中配置启用Form认证 和 角色管理

    <authentication mode="Forms">
      <forms loginUrl="~/Login/Index" timeout="2880" />
    </authentication>
    <roleManager enabled="true" defaultProvider="CustomRoleProvid">
      <providers>
        <clear/>
        <add name="CustomRoleProvid" type="MvcApp.Helper.CustomRoleProvider"/>
      </providers>
    </roleManager>

当我们在Controller 、Action添加注解属性时候,设置的Role是从哪里得到的呢?因为没有使用基于Membership的那一套authentication,这里我们还要创建一个自定义的RoleProvider 。名称为CustomRoleProvider ,继承自 RoleProvider。这里是在MVCApp下面的Helper文件夹中创建了自己的CustomRoleProvider.cs文件。

RoleProvider中有很多abstract 方法,我们具体只实现其中的GetRolesForUser 方法用于获取用户角色。这里的用户角色,我们可以根据拿到的用户Id从数据库查询,或者拿取Session中存储了的、或是Cookie中存储了的。这里我前面已经把Role存储在Ticket的userData中了,那就从Ticket中获取吧。

     public override string[] GetRolesForUser(string username)
        {
            var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
            var ticket = FormsAuthentication.Decrypt(cookie.Value);
            string role = ticket.UserData;
            return role.Split(‘,‘);
        }

在需要,验证的Controller、Action上面添加注解属性,比如这个Action 只允许RoleID 为包含1或2或3的访问,而当前用户RoleID为(7、1、8)就是用户有权访问了。

       [Authorize(Roles="1,2,3")]
        public ActionResult Role()
        {
            ViewData["user"] = User.Identity.Name;
            return View();
        }

P.S.  :1、Ticket存储在在Cookie过期时间,和关闭浏览器是否在记住当前票据,在FormsAuthenticationTicket实例化时候可以设置参数,

    2、Role 的获取可以不要存储在ticket 的userData中,可以直接从数据库读取,userData可以存储其他信息。

    3、要想灵活配置Controller 和Action的 允许访问的Role 可以自定义AuthorizeAttribute  override里面的OnAuthorization方法,在该方法中

读取当前页面允许访问的角色ID,根据当前用户的RoleID,进行检查。这样也就实现了,Role的灵活配置。

4、Ticket中的信息,最终还是存储在cookie中,安全性方面还是自己斟酌吧,个人觉得还是把UserID和RoleID存储在Session中的比较好。

原文地址:https://www.cnblogs.com/asdyzh/p/9741248.html

时间: 2024-11-10 21:53:43

基于FormsAuthentication的用户、角色身份认证(转)的相关文章

基于token的多平台身份认证架构设计

基于token的多平台身份认证架构设计 1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 . 不同的客户端产生了不同的用户使用场景,这些场景: 有不同的环境安全威胁 不同的会话生存周期 不同的用户权限控制体系 不同级别的接口调用方式 综上所述,它们的身份认证方式也存在一定的区别. 本文将使用一定的篇幅对这些场景进行一些分析和梳理工作. 2   使用场景 下面是一些在IT服务常见的一些

基于FormsAuthentication的用户、角色身份认证

一般情况下,在我们做访问权限管理的时候,会把用户的正确登录后的基本信息保存在Session中,以后用户每次请求页面或接口数据的时候,拿到 Session中存储的用户基本信息,查看比较他有没有登录和能否访问当前页面. Session的原理,也就是在服务器端生成一个SessionID对应了存储的用户数据,而SessionID存储在Cookie中,客户端以后每次请求都会带上这个 Cookie,服务器端根据Cookie中的SessionID找到存储在服务器端的对应当前用户的数据. FormsAuthen

掌握基于 JWT 实现的 Token 身份认证

引语 最近正好在独立开发一个后台管理系统,涉及到了基于Token的身份认证,自己边学边用边做整理和总结,对基于JWT实现的Token的身份认证做一次相对比较全面的认识. 一.基于session的跨域身份验证 Internet服务无法与用户身份验证分开.一般过程如下. 用户向服务器发送用户名和密码. 验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中. 服务器向用户返回session_id,session信息都会写入到用户的Cookie. 用户的每个后续请求都将通过在Cookie中

基于ASP.MVC票据FormsAuthenticationTicket身份认证

做一个最基础的业务需求用户登录,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端.服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了. 1.场景 当用户登录成功将信息写入Cookie添加全局静态变量,跳转至主界面如果用户认证信息失效就重新跳转至登录界面 2.代码 2.1 设置Cookie /// <summary> /// 登录验证 /// </summary> /// <returns>

一种基于主板BIOS的身份认证方案及实现

一.BIOS简介 BIOS是只读存储器基本输入/输出系统,它是被固化到计算机中的一组程序,为计算机提供最低级的.最直接的硬件控制,在计算机系统中起着非常重要的作用.BIOS是硬件与软件程序之间的接口,负责解决硬件的即时需求,并按软件对硬件的操作要求具体执行.BIOS的功能包括自检及初始化.硬件中断处理.程序服务处理. 1. 自检及初始化 这个部分的功能是启动计算机,包括三个部分,第一个部分是用于计算机刚接通电源时对硬件部分的检测,也叫做加电自检(POST),功能是检查计算机是否良好.第二个部分是

Axis2学习笔记:用户身份认证

说明:此处的用户身份认证不是基于证书系统的身份认证,如果需要通过证书系统进行身份认证,请使用rampart. 用户身份认证是很多业务系统必须具备的功能,webService也一样,经过本人这几天的学习研究,发现axis2的安全模块rampart不支持基于业务的用户身份认证,只能是基于证书的身份认证,而很多情况下,我们是需要基于业务用户的身份认证的,甚至需要与CAS.SHIRO等安全框架进行整合,这时rampart模块就派不上用场了.而单独的handler,经本人实际测试,在加上后,客户端直接就不

破坏网络可信身份认证,黑灰产业链正在兴起

<2015网络可信身份发展年报> 阿里移动安全 第一章  2015年网络可信身份发展现状 1.1 网络可信身份发展的需求产生新的变化 2002年我国开始了网络实名制建设的探讨,其本质目的在于保障网络空间用户身份可信,避免谣言.欺诈等各种违法犯罪行为.在多年的实践中,网络平台或用户开展网络身份认证主要出于以下两方面的要求: 一方面,国家相关职能部门为保证行业健康有序的发展,要求从事经营或服务***质的互联网用户进行必要的身份认证,如电子商务的经营者(网店主).互联网接入服务提供者(域名注册.网络

身份认证流程描述

1.1.1          身份认证 每个用户都持有可唯一标识用户身份的私钥和由CA签发的公钥证书,用户私有信息保存在电子钥匙(USBKEY)或其它安全载体中.在访问应用系统时,用户出示自已的身份证明(签名和证书),实现基于证书的身份认证过程. 身份认证分为单向或双向认证方式,在一般情况下采用服务器认证客户的单向认证方式,在必要时可采用双向认证方式. 应用系统中,应用服务程序直接通过安全接口调用认证服务器对用户进行身份认证,用户身份信息由应用系统自身进行维护和管理. 应用系统服务器端和客户端各

声纹识别技术助力远重庆时时彩技巧程身份认证无线互联网以及智能手机的迅速发展

声纹"作为一种典型的行为特征,相比其他生理特征在远程身份认证中具有先天的优势,文章介绍了声密保在远程身份认证中的应用,解析了一些在声纹识别准确率.时变问题和噪音问题等方面的技术难点和工程解决经验,最后针对远程身份认证的安全性问题,分享了得意音通在防录音闯入上的最新研究成果.希望对广大读者有所帮助. 声纹在远程身份认证中的应用 网络安全面临重大挑战 无线互联网以及智能手机的迅速发展,给人们日常生活带来极大便利的同时也带来了不容忽视的安全隐患,如何准确.迅速.安全地实现远程身份认证成为摆在人们面前急