长话短说:上文我们讲了 ASP.NET Core 基于声明的访问控制到底是什么鬼?

今天我们乘胜追击:聊一聊ASP.NET Core 中的身份验证。

身份验证是确定用户身份的过程。 授权是确定用户是否有权访问资源的过程。

1. 万变不离其宗

显而易见,一个常规的身份认证用例包括两部分:

① 对用户进行身份验证

② 在未经身份验证的用户试图访问受限资源时作出反应

已注册的身份验证处理程序及其配置选项被称为“方案”,方案可用作一种机制,供用户参考相关处理程序的身份验证、挑战和禁止行为。

我们口头上常说的:

基于cookie认证方案,若认证成功,go on,若认证失败则跳转回登录页面;

基于基本身份认证(BA)方案,若认证成功,go on,若认证失败则给浏览器返回WWW-Authenticate标头, 浏览器会再次弹出认证窗口。

2. ASP.NET Core认证原理

在 ASP.NET Core 中,身份验证由IAuthenticationService负责,身份验证服务会调用已注册的身份验证处理程序来完成与身份验证相关的操作, 整个验证过程由认证中间件来串联。

一图以蔽之:

其中有几个关键步骤

  1. 认证处理程序

    可结合方案Scheme中的配置项AuthenticationSchemeOptions编写认证处理程序。

    基于Cookie的认证方案可在Options项中可指定登录地址,

    基于基本身份的认证方案可在Options项中指定用户名/密码;

  2. 身份认证程序继承自AuthenticationHandler类IAuthenticationHandler接口

  • 核心认证函数可落地基于声明的访问控制,生成绑定了ClaimsPrincipal、Scheme的AuthenticationTicket对象; 无论认证成功/失败,函数返回AuthenticateResult对象

  • 挑战(对未认证的用户做出的反应): 例如返回登录页面

  • 禁止(对已认证,但对特定资源无权访问做出的反应) : 例如返回提示字符串

以上均为服务注册过程

  1. 收到请求,认证中间件使用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 身份认证过程的更多相关文章

  1. ASP.NET Core 身份认证 (Identity、Authentication)

    Authentication和Authorization 每每说到身份验证.认证的时候,总不免说提及一下这2个词.他们的看起来非常的相似,但实际上他们是不一样的. Authentication想要说明 ...

  2. .NET 黑魔法 - asp.net core 身份认证 - Policy

    身份认证几乎是每个项目都要集成的功能,在面向接口(Microservice)的系统中,我们需要有跨平台,多终端支持等特性的认证机制,基于token的认证方式无疑是最好的方案.今天我们就来介绍下在.Ne ...

  3. asp.net core 身份认证/权限管理系统简介及简单案例

    如今的网站大多数都离不开账号注册及用户管理,而这些功能就是通常说的身份验证.这些常见功能微软都为我们做了封装,我们只要利用.net core提供的一些工具就可以很方便的搭建适用于大部分应用的权限管理系 ...

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

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

  5. ASP.NET Core身份识别

    Introduction to Identity 66 of 93 people found this helpful By Pranav Rastogi, Rick Anderson, Tom Dy ...

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

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

  7. 转:细说ASP.NET Windows身份认证

    转自:https://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.html 细说ASP.NET Windows身份认证 阅读目录 开始 认识A ...

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

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

  9. 认识ASP.NET Windows身份认证

    本文摘自:细说ASP.NET Windows身份认证 Forms身份认证虽然使用广泛,不过,如果是在 Windows Active Directory 的环境中使用ASP.NET, 那么使用Windo ...

随机推荐

  1. ArcGis中地理数据库(sde)中概念及常见函数

    以下概念及函数均在在Oracle中配置地理数据库(sde库)中使用: 一.空间类型 1.概念:存储几何数据的数据类型.所有空间信息均存储在空间列中:不存在其他的要素表.将空间信息包含在一个字段中使得在 ...

  2. 【基础知识】Unity查漏补缺

    最近发现了一些平时不太注重的知识点,特此建立个专题,把零散的东西.疏忽的东西临时记录下来. Mecanim动画系统: 1)设置AnimatorController时,如果某个动作播放不正常. 首先打开 ...

  3. HTML5 Drag & Drop

    一定要区分不同事件产生的对象 源元素 属性:draggable = "true" 事件: ondragstart:开始拖拽 ondragend:拖拽结束 目标元素 事件: ondr ...

  4. mysql通过经纬度查询400公里范围内的小区

    mysql距离计算,单位m,以及排序 lng 经度 lat 纬度 一般地图上显示的坐标顺序为,纬度在前(范围-90~90),经度在后(范围-180~180) 传入参数 纬度 40.0497810000 ...

  5. 【小白学PyTorch】9 tensor数据结构与存储结构

    文章来自微信公众号[机器学习炼丹术]. 上一节课,讲解了MNIST图像分类的一个小实战,现在我们继续深入学习一下pytorch的一些有的没的的小知识来作为只是储备. 参考目录: @ 目录 1 pyto ...

  6. pip更新命令

    python -m pip install --upgrade pip 更新时如果报错'NoneType' object has no attribute 'bytes', 解决办法:easy_ins ...

  7. WebSphere MQ常用命令及配置

    WebSphere MQ常用命令及配置 (2012-06-23 23:09:16) 标签: mq命令 杂谈 分类: MQ [导读]WebSphere MQ常用命令及配置 一,队列管理命令 1,创建队列 ...

  8. oracle数据处理之sql*loader(二)

    目录 SQL*Loader对不同文件及格式的处理方法 2.1 Excel文件 一般的Excel文件最大行数不超过65536行,说明数据处理量并不大,处理Excel的方式是将其另存为CSV格式文件,然后 ...

  9. [GXYCTF2019]Ping Ping Ping wp

    根据题目考虑是命令注入方面, 打开网页,使用?ip=127.0.0.1;ls查询存在文件 后尝试使用?ip=127.0.01;cat flag.php打开flag.php无果 尝试打开index.ph ...

  10. 本周 GitHub 速览:自动化当道,破密、爬虫各凭本事

    作者:HelloGitHub-小鱼干 摘要:安全门外汉,如何在不知道密钥或密码的情况下,破解哈希得到原文,Ciphey 会告诉你当中的密码.说到 auto 智能爬虫会基于上一次的爬虫经历进一步学习以获 ...