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

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

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

  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.在登录页面验证完身份信息后的处理

  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中添加的内容

  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接口的类,在其中这样写:

  1. public void Init(HttpApplicationapp)
  2. {
  3. app.PostAuthenticateRequest +=Application_PostAuthenticateRequest;
  4. }
  5. voidApplication_PostAuthenticateRequest(Object sender, EventArgs e)
  6. {
  7. //……
  8. }

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

3.配置文件中的内容 

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

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

源代码

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

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

简单的ASP.NET Forms身份认证的更多相关文章

  1. 细说ASP.NET Forms身份认证

    阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...

  2. ASP.NET Forms身份认证详解

    ASP.NET身份认证基础 在开始今天的内容之前,我想有二个最基础的问题首先要明确: 1. 如何判断当前请求是一个已登录用户发起的? 2. 如何获取当前登录用户的登录名? 在标准的ASP.NET身份认 ...

  3. 细说ASP.NET Forms身份认证 别人写的不过很透彻就转来了以后用时再看

    阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...

  4. IE11下ASP.NET Forms身份认证无法保存Cookie的问题

    IE11下ASP.NET Forms身份认证无法保存Cookie的问题 折腾了三四天,今天才找到资料,解决了. 以下会转贴,还没来得及深究,先放着,有空再学习下. ASP.NET中使用Forms身份认 ...

  5. 【转】权限管理学习 一、ASP.NET Forms身份认证

    [转]权限管理学习 一.ASP.NET Forms身份认证 说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单 ...

  6. 关于Asp.Net Forms身份认证

    Asp.Net管道式的构建个我们提供了通过IHttpMoudle来订阅管线事件来达到干预HTTP请求的目的,Asp.Net的身份认证正是通过此种方式来对请求来执行身份认证的,这篇文章仅仅谈论Forms ...

  7. 权限管理学习 一、ASP.NET Forms身份认证

    说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单实现登录.注销 以前在学习.net的时候不知道什么Forms ...

  8. C# ASP.NET Forms身份认证

    原文:https://www.cnblogs.com/kyo-lynn/p/3418577.html 原文:https://www.cnblogs.com/fish-li/archive/2012/0 ...

  9. ASP.NET Forms身份认证

    asp.net程序开发,用户根据角色访问对应页面以及功能. 项目结构如下图: 根目录 Web.config 代码: <?xml version="1.0" encoding= ...

随机推荐

  1. WinForm GDI+ 资料收集

    UI(User Interface)编程在整个项目开发过程中是个颇为重要的环节,任何好的解决方案若没有良好的用户界面呈现给最终用户,那么就算包含了最先进的技术也不能算是好程序.UI编程体现在两个方面, ...

  2. html 组装table 指定列自动换行

    4列后自动换行思路:int i = 0;while (dr.Read()){    if (i % 4 == 0) 输出一行的开始     输出这个数据    if (i % 4 == 3) 输出一行 ...

  3. 【Java每日一题】20161110

    package Nov2016; import java.util.HashSet; public class Ques1110 { public static void main(String[] ...

  4. Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况

      运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...

  5. 优化JavaScripe 提升首页加载速度的几种方案解析

    优化目的: 1. 减少load量. 2. 优化js,加快页面加载速度. 网站中最影响网站打开速度的是什么?我会告诉是网站中的javascript,简称JS.模板中引用的JS文件越多,打开速度越慢,细读 ...

  6. javascript--Object

    概述 (1)定义 对象(object)是JavaScript的核心概念,也是最重要的数据类型.JavaScript的所有数据都可以被视为对象. 简单说,所谓对象,就是一种无序的数据集合,由若干个&qu ...

  7. Verilog学习笔记简单功能实现(四)...............译码器和编码器

    这里以简单的3-8译码器和8-3编码器为例: module decoder3_8(a,out); :]a; :]out; 'b1<<a;/*把最低位的1左移in位(根据in口输入的值)并赋 ...

  8. InfluxDB学习之InfluxDB的基本概念

    InfluxDB与传统数据库在概念上有许多的不同,本文就给大家介绍下InfluxDB中的一些基本概念,更多InfluxDB详细教程请看:InfluxDB系列学习教程目录 InfluxDB技术交流群:5 ...

  9. MOSOS基础(转自树人云)

      发现 话题 · · · 登录 注册 MesosDocker 回顾Java 发展,看 Docker 与Mesos 演讲嘉宾数人云COO 谢乐冰在德国工作十年,回国后加入惠普电信运营商部门,拥有多年项 ...

  10. Medoo个人修改版

    Medoo是一款轻量级的php数据库操作类,下面不会介绍Medoo的使用方法,想学习Medoo请前往官网自学:http://medoo.in/ 在接触Medoo之前,一直是用自己写的php数据库操作类 ...