深入解读 ASP.NET Core 身份认证过程
长话短说:上文我们讲了 ASP.NET Core 基于声明的访问控制到底是什么鬼?
今天我们乘胜追击:聊一聊ASP.NET Core 中的身份验证。
身份验证是确定用户身份的过程。 授权是确定用户是否有权访问资源的过程。
1. 万变不离其宗
显而易见,一个常规的身份认证用例包括两部分:
① 对用户进行身份验证
② 在未经身份验证的用户试图访问受限资源时作出反应
已注册的身份验证处理程序及其配置选项被称为“方案”,方案可用作一种机制,供用户参考相关处理程序的身份验证、挑战和禁止行为。
我们口头上常说的:
基于cookie认证方案,若认证成功,go on,若认证失败则跳转回登录页面;
基于基本身份认证(BA)方案,若认证成功,go on,若认证失败则给浏览器返回WWW-Authenticate标头, 浏览器会再次弹出认证窗口。
2. ASP.NET Core认证原理
在 ASP.NET Core 中,身份验证由IAuthenticationService负责,身份验证服务会调用已注册的身份验证处理程序来完成与身份验证相关的操作, 整个验证过程由认证中间件来串联。
一图以蔽之:

其中有几个关键步骤
认证处理程序
可结合方案Scheme中的配置项AuthenticationSchemeOptions编写认证处理程序。基于Cookie的认证方案可在Options项中可指定登录地址,
基于基本身份的认证方案可在Options项中指定用户名/密码;身份认证程序继承自
AuthenticationHandler类或IAuthenticationHandler接口。

核心认证函数可落地基于声明的访问控制,生成绑定了ClaimsPrincipal、Scheme的
AuthenticationTicket对象; 无论认证成功/失败,函数返回AuthenticateResult对象。挑战(对未认证的用户做出的反应): 例如返回登录页面
禁止(对已认证,但对特定资源无权访问做出的反应) : 例如返回提示字符串
以上均为服务注册过程
- 收到请求,认证中间件使用
IAuthenticationService对HttpContext按照要求的scheme进行认证, 实际内部会调用第2步编写的认证处理程序。

以上认证原理,之前有一个近身实战: ASP.NET Core 实现基本身份验证。
源代码如下: https://www.cnblogs.com/JulianHuang/p/10345365.html
3. ASP.NET Core获取当前用户
基于声明的访问控制, 我们会在HttpContext.User属性存储身份信息。
var claims = new[] {
new Claim(ClaimTypes.NameIdentifier,username),
new Claim(ClaimTypes.Name,username),
};
var identity = new ClaimsIdentity(claims, Scheme.Name);
var principal = new ClaimsPrincipal(identity);
Context.User = principal;
Web应用程序中获取当前登录用户, 有两种代码场合:
3.1 在控制器中获取当前登录用户
控制器是处理请求的 一等公民,天生自带HttpContext。
直接通过ControllerBase基类中包含的HttpContext属性,获取User对象。
实际上Razor Page、Razor View、Middleware均包含HttpContext属性/参数, 可直接使用。
3.2 在服务中获取当前登录用户
这个时候,服务是作为请求处理中的一个环节,并没有直接可用的HttpContext。
ASP.NET Core 提供了IHttpContextAccessor类能够注入此次请求中的HttpContext对象(依赖注入框架的作用)。
// 下面的用户实体类,需要获取当前登录用户,借助IHttpContextAccessor注入httpContext
public class UserEntityService : IUserEntityService
{
private IHttpContextAccessor _accessor;
private readonly IMongoCollection<UserProfile> _users;
public UserEntityService(IHttpContextAccessor accessor, IDefaultMongoDatabaseProvider databaseProvider)
{
_accessor = accessor;
_users = databaseProvider.GetCollection<UserProfile>(CollectionNames.UserProfiles);
}
public Task<UserProfile> GetCurrentUserAsync()
{
var rawUser = this._accessor.HttpContext.User();
if (rawUser == null)
{
return null;
}
var filter = Builders<UserProfile>.Filter.Eq("UserId", rawUser.UserId);
return _users.Find(filter).FirstOrDefaultAsync();
}
}
+ abp vnext
我们不需要区分以上代码场合,在Controller或者Application 服务中使用ICurrentUser接口拿到登录用户。
旁白
个人认为,ASP.NET Core身份认证的源代码, 基于现实认知提炼而来,让我们惊叹于框架代码的的简洁精炼、层次分明。
基于声明的访问控制已成标准,ASP.NET Core/abp vnext 均提供了完善的支持。
深入解读 ASP.NET Core 身份认证过程的更多相关文章
- ASP.NET Core 身份认证 (Identity、Authentication)
Authentication和Authorization 每每说到身份验证.认证的时候,总不免说提及一下这2个词.他们的看起来非常的相似,但实际上他们是不一样的. Authentication想要说明 ...
- .NET 黑魔法 - asp.net core 身份认证 - Policy
身份认证几乎是每个项目都要集成的功能,在面向接口(Microservice)的系统中,我们需要有跨平台,多终端支持等特性的认证机制,基于token的认证方式无疑是最好的方案.今天我们就来介绍下在.Ne ...
- asp.net core 身份认证/权限管理系统简介及简单案例
如今的网站大多数都离不开账号注册及用户管理,而这些功能就是通常说的身份验证.这些常见功能微软都为我们做了封装,我们只要利用.net core提供的一些工具就可以很方便的搭建适用于大部分应用的权限管理系 ...
- 细说ASP.NET Forms身份认证
阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...
- ASP.NET Core身份识别
Introduction to Identity 66 of 93 people found this helpful By Pranav Rastogi, Rick Anderson, Tom Dy ...
- 关于Asp.Net Forms身份认证
Asp.Net管道式的构建个我们提供了通过IHttpMoudle来订阅管线事件来达到干预HTTP请求的目的,Asp.Net的身份认证正是通过此种方式来对请求来执行身份认证的,这篇文章仅仅谈论Forms ...
- 转:细说ASP.NET Windows身份认证
转自:https://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.html 细说ASP.NET Windows身份认证 阅读目录 开始 认识A ...
- 【转】权限管理学习 一、ASP.NET Forms身份认证
[转]权限管理学习 一.ASP.NET Forms身份认证 说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单 ...
- 认识ASP.NET Windows身份认证
本文摘自:细说ASP.NET Windows身份认证 Forms身份认证虽然使用广泛,不过,如果是在 Windows Active Directory 的环境中使用ASP.NET, 那么使用Windo ...
随机推荐
- IDEA创建MAVEN项目并使用tomcat启动
一.开发环境准备 1.JDK1.8,已经配置好环境变量 2.IDEA2019.2,目前稳定版里面个人认为还不错的 3.tomcat服务器,笔者使用的是apache-tomcat-8.5.57 4.使用 ...
- 5G边缘计算:开源架起5G MEC生态发展新通路
摘要:本文尝试从边缘计算的角度来阐述了为什么要把边缘计算当做一种新的生产关系来构建,以及如何用开源来构建这种新的生产关系. 5G推动新一轮工业革命 过去人类经历了三次工业革命, ...
- ReentrantLock特性
1.中断 2.超时 3.公平 4.重入 5.多条件
- Python 快速验证代理IP是否有效
有时候,我们需要用到代理IP,比如在爬虫的时候,但是得到了IP之后,可能不知道怎么验证这些IP是不是有效的,这时候我们可以使用Python携带该IP来模拟访问某一个网站,如果多次未成功访问,则说明这个 ...
- Python 30道高频面试题及详细解答
开学啦,开学啦!周末坐地铁的时候看到很多同学推着行李箱,拎着大包小包的穿梭在人群中,哎新的一学期又开始啦,同时也意味着很多同学要准备毕业啦,尤其是准大四,准研三的同学. 今年的招聘行情并不乐观,小公司 ...
- 趣味vi:Do you love me?
看到网上有很多这样的小趣味exe,自己用labview也做了一个,可能有很多bug,马马虎虎能用,大家可以发给自己滴那个人,哈哈哈.源码vi和exe文件都在链接中https://files.cnblo ...
- Android Studio Eclipse运行时出现 finished with non-zero exit value 2 错误解决方法
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing Error:Ex ...
- Android开发之AlertDialog警告提示框删除与取消 详解代码
package cc.jiusansec.www; import android.app.Activity; import android.app.AlertDialog; import androi ...
- Spine学习五- spine动画融合
在许多地方,都需要用到动画融合,unity的新版动画系统已经能够很方便的进行动画融合,那么使用spine的动画状态机的情况下,如何来进行动画融合呢? 官方有两种方案,一种是使用混合动作实现,另一种是使 ...
- 前端通过jqplot绘制折线图
首先需要下载jqplot需要的js与css文件,我已近打包好了,需要的可以下载 接下来导入其中关键的js与css如下, <link href="css/jquery.jqplot.mi ...