Asp.net Authenticatiion & Authorization(认证与授权)——表单验证

本文大量摘抄 asp.net Forms表单验证 使用经验及验证流程分析

尽管使用Asp.net做过几个简单项目,但是一直没有真正理解认证和授权这一块是怎么回事。打开vs 2015/2017的模板,却连内置框架中的Identity都看不懂。找了网上一些文章,发现都提到membership和表单验证。于是决定把这所有东西都弄清楚。在学习过程中,除了书本能让我收获有体系知识,网上很多文章写得非常好,能够让人很快明白某一个点的知识。


以下把自己学习过程整理为几篇文章,算是个笔记,水平有限,当是给自己复习的笔记 。

Asp.net 验证

验证是一个这样的过程,通过用户提供的证明信息,对于有效合法的信息产生一个唯一 可识别的标记(Identity)的过程。这对于一个网站系统来说其实包含几件事情:
1.凭据输入(例如登录页面)
2.凭据的管理,如CURE,有效性及安全性的维护等。
3.凭据的存储
而在membership 出来之前 (2005年之前),Asp.net 的验证其实只有以下4种:
Windows 验证; 
表单验证;
Passport 验证;
自定义验证流程
显然以上的几种,除了自定义验证流程,其它三种都无法完全实现验证涉及的整个流程。以下通过尝试解析表单验证过程来说明验证中需要涉及的事情以及表单验证存在的一些问题。


表单验证:

表单验证是一个基于票据(ticket-based)也称为基于令牌(token-based)的系统。这意味着当用户登录系统后,表单验证模块得到一个包含基本用户信息的票据(ticket). 这些信息被存放在加密过的cookie里面,这些cookie 和响应绑定在一起,因此每一次后续请求都会被自动提交到服务器。

Asp.net的处理流程具体是这样的:
1. 用户在没有登录的情况访问网站,在浏览器输入请求到了IIS,正常情况下通过IIS传送到ASP.Net管道;
2. Asp.net FormsAuthenticationMoudle检查请求是否有有效cookie,如果没有,返回给用户登录页面;此时HttpContext.User.IsAuthenticated=false;
3. 用户输入凭据,提交。
4. 服务端程序检查用户名和密码,如果正确,就调用FormsAuthentication.SetAuthCookie方法生成登录cookie;此时如果没有权限设定的话,HttpContext.User.IsAuthenticated=true.
5. 如果还有权限设定,则测试授权;
6.认证和授权都通过后,HttpContext.User.IsAuthenticated=true. 返回用户请求的页面。
7.用户再次请求需要登录的页面;
8.FormsAuthenticationModule检查到了用户身份的cookie,HttpContext.User.IsAuthenticated = true
9. 在Asp.net 管道Authroized有效的阶段内,用户不需要再登录即可以一直浏览网站


图片来自    《ASP.NET 4 高级程序设计》第4版


实现的关键步骤

(完全摘自 asp.net Forms表单验证 使用经验及验证流程分析 , 摘抄是两个原因,一是为了自己以后遇到forms验证可以快速回顾相关知识点,二是vs版本太新了,没有相应的.net 模板可以自己实现):


一,配置

假设有这样一个目录,需求这样子:
两个文件夹分别为User和Admin,在每一个文件夹中又有login.aspx、index.aspx和web.config。通用户访问User文件夹需要首先要在用户登陆界面进行登陆,成功后才能访问用户的index.aspx。而管理员则首先要在Admin的登陆界面进行登陆,才能访问Admin中的index.aspx。


在根目录的Web.config下,需要做这样的配置


在forms元素里,设置了name和loginUrl。 name表示cookie的名字。LoginUrl 顾名思义就是登陆页面的地址。如果说用户没有权限访问某一页面,就会被重定向到这个页面。

两个子目录下web.config的配置


在这个配置文件中,不能配置“验证”节的内容(该内容只能在虚拟目录的根目录web.config中配置),我们只能对“授权”节进行配置。上述的location的作用是表示该路径不需要进行授权检查, 而其他路径,则不希望未登陆的用户或网站管理员登陆,因此使用<allow roles="user">来允许只有角色为user的用户访问,而其他任何用户都拒绝访问。


二、关键代码


 在global.asax中有一个Application_AuthenticateRequest事件,该事件会在服务器决定该用户浏览器是否应该跳转前发生。因此,我们只要在这里对用户角色进行配置,就可以达到目的。


注意:不能在同一台电脑上即登陆用户界面又登陆管理员界面。因为使用Forms名称所能保留的cookie只可能是一个,所以如果登陆了管理员界面后,接着登陆用户界面,就会覆盖原来的cookie值。

存在问题:

1.必须创建登录界面供用户登录;

2.必须维护用户凭证所在的目录;

3.必须采取额外的措施来防止网络中传输的截获(用户信息的加密)。


发布了32 篇原创文章 · 获赞 7 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/mochounv/article/details/80189043
今日推荐