.Net身份验证概述
一直以来,所有的系统基本都会有用户的登陆验证过程,整个过程其实也不难理解,就是对于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 入门(二) (介绍得很直白,适合入门)
.Net身份验证概述的更多相关文章
- ASP.NET Forms身份验证概述
表单身份验证允许您使用自己的代码对用户进行身份验证,然后在cookie或页面URL中维护身份验证令牌.表单身份验证通过FormsAuthenticationModule类参与ASP.NET页面生命周期 ...
- [转]IIS的各种身份验证详细测试
本文转自:http://www.cnblogs.com/chnking/archive/2007/11/20/965553.html#_Toc183326163 一. IIS的身份验证概述 1. ...
- ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介
概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware ...
- ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介
概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...
- MVC5 网站开发实践 2.2、管理员身份验证
上次完成了管理员的登录,这次要解决对管理员登录后的验证,采用AuthorizeAttribute属性的方式.之前还要解决几个问题,然后才重写验证类,最后稍微改一下界面. 目录 MVC5 网站开发实践 ...
- (实用篇)php通过会话控制实现身份验证实例
会话控制的思想就是指能够在网站中根据一个会话跟踪用户.这里整理了详细的代码,有需要的小伙伴可以参考下. 概述 http 协议是无状态的,对于每个请求,服务端无法区分用户.PHP 会话控制就是给了用户一 ...
- 初识Identity并添加身份验证管理页面
目录 初识Identity并添加身份验证管理页面 前言 什么是ASP.NET Core Identity 创建带有身份验证的WebApp 尝试运行 检查解决方案中的项目文件 发现问题 原因 解决问题 ...
- 如何通过使用窗体身份验证和 Visual C#.NET 对 Active Directory 验证身份
本分步指南演示如何在 ASP.NET 应用程序如何使用窗体身份验证允许用户使用轻型目录访问协议 (LDAP),对 Active Directory 进行验证.经过身份验证的用户重定向之后,可以使用Ap ...
- NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介
NET Core 1.1 静态文件.路由.自定义中间件.身份验证简介 概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要 ...
随机推荐
- [ZZ]Sign Up for the First-Ever Appium Roadshow on August 20th in New York City
http://sauceio.com/index.php/2014/07/appium-roadshow-nyc/?utm_source=feedly&utm_reader=feedly&am ...
- FZU 2148 Moon Game --判凹包
题意:给一些点,问这些点能够构成多少个凸四边形 做法: 1.直接判凸包 2.逆向思维,判凹包,不是凹包就是凸包了 怎样的四边形才是凹四边形呢?凹四边形总有一点在三个顶点的内部,假如顶点为A,B,C,D ...
- Vector3D - AS3
Vector3D 类使用笛卡尔坐标 x.y 和 z 表示三维空间中的点或位置.与在二维空间中一样,x 属性表示水平轴,y 属性表示垂直轴.在三维空间中,z 属性表示深度.当对象向右移动时,x 属性的值 ...
- Oracle 排序中使用nulls first 或者nulls last 语法
-原理 Nulls first和nulls last是Oracle Order by支持的语法 如果Order by 中指定了表达式Nulls first则表示null值的记录将排在最前(不管是asc ...
- 一篇文章告诉你为何GitHub估值能达20亿美元
软件开发平台GitHub今日宣布,已获得硅谷多家知名风投2.5亿美元融资,这也让其融资总额达到了3.5亿美元,此轮融资对GitHub的估值约为20亿美元. GitHub有何特别之处? GitHub创立 ...
- poj 1050 To the Max
To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45906 Accepted: 24276 Desc ...
- Eclipse调试按钮消失问题
Window-->Reset Perspective 把Eclipse重置一下,然后 点击红色框圈的向下的箭头,在弹出的菜单里边,点击 show debug toolbar 这个菜单项目,然后奇 ...
- C语言 数组做函数参数不传数组个数的遍历方法
//数组做函数参数不传数组个数的遍历方法 #include<stdio.h> #include<stdlib.h> #include<string.h> void ...
- php基础24:数组range
<?php $numbers = range(1, 10); echo "<pre>"; var_dump($numbers); echo "</ ...
- 解决SaveChanges会Hold住之前的错误的问题
问题描述: 在一次新增操作中,由于有一个必填字段忘记写了,然后直接点击提交,运行到savechanges的地方,程序报错,提示***字段为必填字段. 然后关掉页面,重新填写一次,这次什么都填写上了,一 ...