• 简单的ASP.NET Forms身份认证


       读了几篇牛人的此方面的文章,自己也动手做了一下,就想有必要总结一下。当然我的文章质量自然不能与人家相比,只是写给从没有接触过这个知识点的朋友。

      网站的身份认证我以前只知道session,偶然发现一些牛人提倡用Forms方式,微软官方也推荐这种方法。详见使用Session作为身份识别的问题

     

      ASP.NET的身份认证方式是在web.config文件中configuration->system.web->authentication指定,如

     

    [html] view plain copy
     
     print?
    1. <authentication mode="Forms" >  
    2.           <forms cookieless="UseCookies"name="LoginCookieName"loginUrl="~/Default.aspx"></forms>  
    3. </authentication>  

    mode="Forms"表示的即时Form身份认证方式。另外还有none、passport、windows可选,其他两个尚不知,windows的方式和SQL server的Management Stdio 的windows身份验证是一个道理。当网站的IP是localhost的时候,网站不用登录即时登录状态,而只有是其他IP的时候,登录网站才需要输入本机的用户名,密码。而本文要说的就是Forms身份验证。

     

    程序分为三步:在login.aspx页面登录写入cookie;用户访问default.aspx程序读出cookie数据并赋予用户对应的角色;程序查看Global.asax看用户是否有权限访问该页面。

     

    1.在登录页面验证完身份信息后的处理

     

    [csharp] view plain copy
     
     print?
    1. var ticket = new FormsAuthenticationTicket(  
    2.         1, name, DateTime.Now, DateTime.Now.AddMinutes(5),true, "admin");//构造用户票据  
    3. string cookieValue =FormsAuthentication.Encrypt(ticket);  
    4. HttpCookie cookie =new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue);  
    5. Response.Cookies.Remove(cookie.Name);  
    6. Response.Cookies.Add(cookie);  

    FormsAuthenticationTicket的构造参数说明:版本号、票据名、构造时间、过期时间、是否持久化(如果为true表示票据存储在持久性cookie中,即跨浏览器会话),用户自定义数据(这里存放的是登录用户角色列表,用“,”分隔)。

    然后将票据加密存进cookie

    这是FF中的web developer看到的,value是加密后的结果。Path是指针网站下对某目录或页面,”/“则表示针对整个网站。HttpOnly如果为true则表示脚本程序不能访问,这样能防止一些XSS攻击利用Httponly提升web应用程序安全性

    2.在Global.asax中添加的内容

    [csharp] view plain copy
     
     print?
    1. void Application_PostAuthenticateRequest(Object sender, EventArgs e)  
    2.     {  
    3.         HttpApplication App =(HttpApplication)sender;  
    4.         HttpContext context = App.Context; //获取本次Http请求相关的HttpContext对象  
    5.         if (context.Request.IsAuthenticated) //验证过的用户才进行role的处理  
    6.         {  
    7.             FormsIdentity Id =context.User.Identity as FormsIdentity;  
    8.             FormsAuthenticationTicket Ticket =Id.Ticket; //取得身份验证票  
    9.             string[] Roles =Ticket.UserData.Split(','); //将身份验证票中的role数据即前面存储在cookie的自定义用户数据转成字符串数组  
    10.             context.User = new GenericPrincipal(Id, Roles); //将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息  
    11.         }  
    12.     }  

    Application_PostAuthenticateRequest是asp.Net管线中的一个事件,在页面请求的时候会触发。有关详细知识还有待学习。

    这一步也可以自己定义一个实现IHttpModule接口的类,在其中这样写:

     

    [csharp] view plain copy
     
     print?
    1. public void Init(HttpApplicationapp)  
    2.     {  
    3.         app.PostAuthenticateRequest +=Application_PostAuthenticateRequest;  
    4.     }  
    5.    
    6.     voidApplication_PostAuthenticateRequest(Object sender, EventArgs e)  
    7.     {  
    8.         //……  
    9.     }  

    用户在经过第一步的登录后已在浏览器上存储了cookie,再次请求另一个页面时,经过Global.asax中的Application_PostAuthenticateRequest处理,在context.User中存放了角色信息。这里我们构造context.User里有一个私有的user字段,这个字段只能利用IsInRole方法来判断用户是否属于某,我们不能对它修改,而且这个字段每次初始化的时候总是为空,我们只好利用这种方式来为用户附上角色信息。

    3.配置文件中的内容 

    [html] view plain copy
     
     print?
    1. <system.web>  
    2.     <compilationdebugcompilationdebug="true" targetFramework="4.0"/>  
    3.     <httpRuntime requestValidationMode="2.0"/>  
    4.    
    5.    <!--我在WebSite的App_Code文件夹下创建了Module文件夹,并添加了MyModule类-->  
    6.     <httpModules>  
    7.       <addnameaddname="MyModule"type="MyModule"/>  
    8.     </httpModules>  
    9.      
    10.     <authentication mode="Forms">  
    11.     <!--name是存放cookie信息的用户名,loginUrl是指定的登录页面(当用户没权限访问下面location限制的页面时会跳转到此页面),timeout是cookie过期时间-->  
    12.       <forms cookieless="UseCookies" name=" logincookie" loginUrl="~/login.aspx" timeout="5"></forms>  
    13.     </authentication>  
    14.     <authorization>  
    15.       <allowusersallowusers="*"/>  
    16.     </authorization>  
    17.  </system.web>  
    18.   
    19.    <!--location中的path可以是一个文件夹,也可以是一个页面,来限制某些页面的访问权限。下面表示Default.aspx只对admin角色开发。注意,如果限制某些页面只能被某些角色访问,则最后一定要加<deny users="*"/>-->  
    20.   <location path="Default.aspx">  
    21.     <system.web>  
    22.       <authorization>  
    23.         <allow roles="admin"/>  
    24.         <deny users="*"/>  
    25.       </authorization>  
    26.     </system.web>  
    27.   </location>  

    程序执行完第二步,到配置文件中查看角色是否有权限访问请求页面。

    源代码

    参考文章:细说ASP.NET Forms身份认证 asp.net中使用基于角色role的Forms验证 

    另外强烈推荐一个博客:http://www.cnblogs.com/fish-li/

  • 相关阅读:
    win7下安装Linux实现双系统全攻略
    Dreamweaver_CS6安装与破解,手把手教程
    windows Server 2008各版本有何区别?
    如何查看路由器中的pppoe拨号密码?
    xp远程桌面连接最大用户数怎么设置?
    网站的盈利模式
    linux 下安装mysql-5.7.16
    GNS3连接虚拟机
    cain使用教程
    数据中心网络架构的问题与演进 — CLOS 网络与 Fat-Tree、Spine-Leaf 架构
  • 原文地址:https://www.cnblogs.com/webenh/p/6127908.html
Copyright © 2020-2023  润新知