实战解读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负责,身份验证服务会调用已注册的身份验证处理程序来完成与身份验证相关的操作, 整个验证过程由认证中间件来串联。


一图以蔽之,身份认证伪代码呼之欲出


471f67ba63a2f68374e030d83ca646d4.png


其中有几个关键步骤


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

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


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


9d558a2140013cc7d1859e39025851d6.jpg


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


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


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


以上均为服务注册过程


  1. 收到请求,认证中间件使用IAuthenticationService对HttpContext按照要求的scheme进行认证,实际内部会调用第2步编写的认证处理程序。


254b75c95bfab9964d78b42957a89dd9.png


以上认证原理,有一个近身实战: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身份认证的源代码, 基于现实认知提炼而来,让我们惊叹于框架代码的的简洁精炼、层次分明。

相关文章
|
1月前
|
Cloud Native API C#
C#的现代化:.NET Core引领的技术革命
【6月更文挑战第9天】`.NET Core引领C#现代化,实现跨平台革命,提升性能并支持云原生应用。异步编程模型优化体验,统一API简化开发流程。C#应用场景扩展,开发效率提高,技术创新加速,预示其未来在技术领域将持续发挥关键作用。`
34 10
|
7天前
|
开发框架 .NET API
.NET Core 和 .NET 标准类库项目类型有什么区别?
在 Visual Studio 中,可创建三种类库:.NET Framework、.NET Standard 和 .NET Core。.NET Standard 是规范,确保跨.NET实现的API一致性,适用于代码共享。.NET Framework 用于特定技术,如旧版支持。.NET Core 库允许访问更多API但限制兼容性。选择取决于兼容性和所需API:需要广泛兼容性时用.NET Standard,需要更多API时用.NET Core。.NET Standard 替代了 PCL,促进多平台共享代码。
|
14天前
|
开发框架 JSON .NET
|
17天前
|
开发框架 .NET Nacos
使用 Nacos 在 C# (.NET Core) 应用程序中实现高效配置管理和服务发现
使用 Nacos 在 C# (.NET Core) 应用程序中实现高效配置管理和服务发现
41 0
|
19天前
|
存储 JSON NoSQL
技术心得记录:在.NETCore中使用CSRedis
技术心得记录:在.NETCore中使用CSRedis
13 0
|
19天前
|
SQL 开发框架 .NET
(20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)
(20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)
|
1月前
|
开发框架 .NET Linux
【.NET Developer】已发布好的.NET Core项目文件如何打包为Docker镜像文件
该文介绍了如何不使用VS2019手动创建ASP.NET Core Blazor项目的Dockerfile并构建Docker镜像。首先,创建名为Dockerfile的文件,并复制提供的Dockerfile内容,该文件指定了基础镜像和工作目录。然后,通过CMD在项目目录下运行`docker build -t 自定义镜像名 .`来生成镜像。最后,使用`docker run`命令启动容器并验证项目运行。此外,文章还提到了将镜像推送到Azure Container Registry (ACR)的步骤。
|
开发框架 .NET 中间件
ASP.NET Core 面试题(二)
ASP.NET Core 面试题(二)
295 0
|
开发框架 JSON .NET
ASP.NET Core 面试题(一)
ASP.NET Core 面试题(一)
921 0
|
2月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
114 0