长话短说:上文我们聊了 ASP.NET Core 基于声明的访问控制到底是什么鬼?
今天我们乘胜追击:聊一聊ASP.NET Core 中的身份验证。

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

1. 万变不离其宗

显而易见,一个常规的身份认证用例包括两部分:
① 对用户进行身份验证
② 在未经身份验证的用户试图访问受限资源时作出反应

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

我们口头上常说的:
基于cookie认证方案,若认证成功,go on,若认证失败则跳转回登录页面;
基于基本身份认证(BA)方案,若认证成功,go on,若认证失败则给浏览器返回WWW-Authenticate标头, 浏览器会再次弹出认证窗口。

2. ASP.NET Core认证原理

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

一图以蔽之:

其中有几个关键步骤

  1. 添加认证方案
    由配置项AuthenticationSchemeOption、认证处理程序组成。

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

  2. 认证处理程序   继承AuthenticationHandler类IAuthenticationHandler接口

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

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

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

以上均为服务注册过程

  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端点路由作用原理

  • 临近年关,修复ASP.NET Core因浏览器内核版本引发的单点登录故障

  • 手撕公司SSO登录原理

  • Quartz.net在集群环境下部署任务的姿势

  • ASP.NET Core应用注意这一点,CTO会对你刮目相看

更多精彩

扫码关注

绘图+文字均为原创, 觉得有用,麻烦三连 ~..~

实战解读ASP.NET Core身份认证相关推荐

  1. Asp.net core 身份认证框架 Microsoft Identity的使用以及如何使用Idengtity创建自带的用户模型SignInManager和UserManager的使用等等

    要启动身份认证组件,首先要更改数据库上下文中继承的关系,原本我们是继承于 Dbcontext这个类,现在我们需要继承IdentityDbContext 继承这个类,我们需要安装对应的框架, 如图: 这 ...

  2. 快速理解ASP.NET Core的认证与授权

    ASP.NET Core的认证与授权已经不是什么新鲜事了,微软官方的文档对于如何在ASP.NET Core中实现认证与授权有着非常详细深入的介绍.但有时候在开发过程中,我们也往往会感觉无从下手,或者由 ...

  3. [转载]细说ASP.NET Windows身份认证

    细说ASP.NET Windows身份认证 阅读目录 开始 认识ASP.NET Windows身份认证 访问 Active Directory 在ASP.NET中访问Active Directory ...

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

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

  5. ASP.NET Core身份认证服务框架IdentityServer4(2)-整体介绍

    一.整体情况 现代应用程序看起来更像这个: 最常见的相互作用: 浏览器与Web应用程序的通信 Browser -> Web App Web应用程序与Web API通信 基于浏览器的应用程序与We ...

  6. asp.net core 外部认证多站点模式实现

    PS:之前因为需要扩展了微信和QQ的认证,使得网站是可以使用QQ和微信直接登录.github 传送门 .然后有小伙伴问,能否让这个配置信息(appid, appsecret)按需改变,而不是在 Con ...

  7. ASP.NET Core——身份验证UI安装

    目录 介绍 要求 安装步骤 1.身份验证和身份UI配置 2.身份持久性实现 创建数据库 为Entity Framework Core配置ASP.NET Core 通过Entity Framework ...

  8. asp.net form身份认证不定时认证失败的问题 排查

    1.网站出现form认证不定时认证失败.登陆过后 每隔一会儿就需要重新登陆.首先检查的是form身份认证票据设置的时间(正常) 然后检查加密后的身份认证信息写入的cookie的失效时间(正常) 2.这 ...

  9. ASP.NET MVC身份认证与授权

    文章目录 一.引言 1.身份认证的含义 2.身份认证与Session 基于Session保存用户状态 不足之处 二.ASP.NET身份验证 Forms验证 FormsAuthentication类 验 ...

最新文章

  1. (转自Timon's wang blogs)C#实现web信息自动抓取
  2. php链接数据库实行增删查改_利用PHP连接数据库——实现用户数据的增删改查的整体操作实例...
  3. 彻底学会使用epoll(一)——ET模式实现分析
  4. linux恢复桌面,ubuntu恢复unity桌面
  5. 指定jupyter运行的conda环境和报错处理generator_to_async_generator
  6. 50.magento 订单状态
  7. 【游戏】基于matlab GUI万年历【含Matlab源码 257期】
  8. 数据可视化的定义及使用注意
  9. 如何安装uclient_uclient软件下载|
  10. 一、 Vue.js简介
  11. 在 100% 鲜活的时间,请让我遇见你
  12. java自定义类加载器并观察类卸载过程
  13. java graphics2d 绘图_java GUI Graphics2D 绘图
  14. php里切换不了输入法,电脑中怎么切换输入法
  15. 最新-安装Windows与Ubuntu双系统
  16. 2. 将文件中每一行字符反序
  17. 免费gpt-4-国内使用gpt-4
  18. C语言大数相乘(整形)
  19. python雪花曲线实验报告_探究“雪花”曲线
  20. mysql的url地址什么意思_URL是什么意思?

热门文章

  1. opencv-原图基础上添加指定颜色
  2. geotrellis使用(二十九)迁移geotrellis至1.1.1版
  3. border:none 与border:0的区别
  4. 三种查看SqlServer中数据物理pge页的方法
  5. APP开发者到期续费说明
  6. DataAdapter.FillSchema 方法
  7. 不知道为什么IList.Contains()总是返回FALSE
  8. 在Word XP中也能插入国际音标、拼音
  9. 什么是自然语言处理,它如何工作?
  10. rimraf 秒删 node_modules