一直以来,所有的系统基本都会有用户的登陆验证过程,整个过程其实也不难理解,就是对于cookie的解析。微软的.Net平台围绕用户身份验证授权也有好几个版本了,从早期的Membership到Identity。微软的想法是尽量把这些基础的功能封装,让我们调用起来越来越方便,但由于可拓展性,复杂度和相关资料也并不多,源码研究起来也比较费劲。说来惭愧,之前的项目一直没有用的这块内容。这次有机会从新做授权登陆相关,所以好好整理了一下,方便以后查阅。
为什么不用Session?
由于Http协议的无状态性,所以一般的用户登陆验证信息都是放在浏览器的cookie中。当然,有人使用session来保存用户信息也未尝不可,但笔者认为用session会增加服务器资源。虽然你可能会说这点内容基本不会占用太多内存,但是在互联网大用户的背景下,多台服务器做负载,即便使用缓存服务器如Redis,也还是会增加负担。那么为什么不来用cookie存储呢?事实上,众多互联网企业也确实是在使用cookie的。
一、核心思想(Forms 认证)
这的土办法也是我们之前做登陆验证用的,也是.Net的核心思想。
首先,我们会在IHttpModule处理管道中增加一个认证模块,也就是FormsAuthenticationModule,在这个模块中会查找登陆cookie,没有的话就说明没有登陆,有的话就解析这个cookie获得里面用户信息,给HttpContext.User的IPrincipal这个对象赋值。
那么,通常我们会在需要登陆验证的方法或者控制器上使用AuthorizeAttribute标签,它内部会判断HttpContext.User的IPrincipal是不是为空,为空就是没有登陆。那么这个对象在哪里来呢?
在ASP.NET中实现登录与注销的方法:
1. 登录:调用FormsAuthentication.SetAuthCookie()方法,传递一个登录名即可。
2. 注销:调用FormsAuthentication.SignOut()方法。
这里,如果要修改登陆cookie的信息,如过期时间,增加字段等,需要重写IPrincipal方法,去实现在SignIn写cookie的方法和在Application_AuthenticateRequest时解析cookie设置HttpContext.User对象。
还要一个UrlAuthorizationModule,就是检查用户角色有没有权限访问某个Url路径的。因为这个在WebForm中比较有用,在Mvc和以后的发展中就基本没什么用了,所以不多说。
有兴趣的话,可以看 细说ASP.NET Forms身份认证 里面讲的非常详细。
二、Mvc5 Owin + Identity(Claims-based 认证) -- Indentity 2.0
时代总是会发展,微软总是想帮我们做更多的事情。为了弥补Membership的不足和推广Open Web Interface for .Net(Owin)解耦服务器和应用,并与oauth接口第三方平台登陆,推出了Identity + Owin的组合。虽然也有Microsoft.AspNetCore.Identity.EntityFrameworkCore,用来实现ef的库创建,但其最核心的类库还是 Microsoft.AspNet.Identity.Core。
Claims-based简单的说就是将登陆与认证和授权分开,将认证与授权做成单独服务,登陆只要指向这个服务,并拿到返回的令牌(包括用户信息,用户名,角色等)。
盗一个图来解释与qq集成的登陆场景:
微软大神真的是不知道累啊。。。前前后Identity和owin有好多个版本更新,每次的会封装一些新的类,新的使用方法,看似用起来容易了,可是东西太多,太杂,太乱了,学习资料也是随着版本的不同,前后有出入。。。累啊。。。所以这里,我不基于它封装好的类来写,而是基于它核心的几个类,这样更容易理解内容的机制。
Identity中:
UserManager:用来创建用户和查询用户,包括
觉得不好的话,有几篇精彩的博文可以参考:
MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN (重点原理)
Microsoft.AspNet.Identity 的简单使用
ASP.NET Identity 2集成到MVC5项目--笔记01 (很适合上手)
- Asp.Net Identity学习笔记+MVC5默认项目解析_基础用法
- Asp.Net Identity学习笔记+MVC5默认项目解析_授权&Claim
- Asp.Net Identity学习笔记+MVC5默认项目解析_第三方登入&授权总结
跌倒了,再爬起来:ASP.NET 5 Identity (基本没用,好像不是在说同一个东西,估计他研究的Asp.Net 5却有不同吧,反正Asp.Net5现在也基本废了)
三、.Net Core Identity -- Indentity 3.0
ASP.NET Core 之 Identity 入门(一)|ASP.NET Core 之 Identity 入门(二) (介绍得很直白,适合入门)