实战解读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月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
6天前
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
|
1月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
1月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
29 1
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
92 3
|
1月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
38 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
58 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
47 0

热门文章

最新文章