在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
长话短说:上文我们讲了 ASP.NET Core 基于声明的访问控制到底是什么鬼? 身份验证是确定用户身份的过程。 授权是确定用户是否有权访问资源的过程。 1. 万变不离其宗 显而易见,一个常规的身份认证用例包括两部分: 已注册的身份验证处理程序及其配置选项被称为“方案”,方案可用作一种机制,供用户参考相关处理程序的身份验证、挑战和禁止行为。 我们口头上常说的: 2. ASP.NET Core认证原理 在 ASP.NET Core 中,身份验证由IAuthenticationService负责,身份验证服务会调用已注册的身份验证处理程序来完成与身份验证相关的操作, 整个验证过程由认证中间件来串联。 其中有几个关键步骤 1、认证处理程序 基于Cookie的认证方案可在Options项中可指定登录地址, 2、身份认证程序继承自AuthenticationHandler类或IAuthenticationHandler接口。 核心认证函数可落地基于声明的访问控制,生成绑定了ClaimsPrincipal、Scheme的AuthenticationTicket对象; 无论认证成功/失败,函数返回AuthenticateResult对象。 挑战(对未认证的用户做出的反应): 例如返回登录页面 禁止(对已认证,但对特定资源无权访问做出的反应) : 例如返回提示字符串 以上均为服务注册过程 收到请求,认证中间件使用IAuthenticationService对HttpContext按照要求的scheme进行认证, 实际内部会调用第2步编写的认证处理程序。 以上认证原理,之前有一个近身实战: ASP.NET Core 实现基本身份验证。 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。 实际上Razor Page、Razor View、Middleware均包含HttpContext属性/参数, 可直接使用。 3.2 在服务中获取当前登录用户 这个时候,服务是作为请求处理中的一个环节,并没有直接可用的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(); } } 我们不需要区分以上代码场合,在Controller或者Application 服务中使用ICurrentUser接口拿到登录用户。 旁白 个人认为,ASP.NET Core身份认证的源代码, 基于现实认知提炼而来,让我们惊叹于框架代码的的简洁精炼、层次分明。 基于声明的访问控制已成标准,ASP.NET Core/abp vnext 均提供了完善的支持。 到此这篇关于深入解读ASP.NET Core身份认证过程实现的文章就介绍到这了,更多相关ASP.NET Core 身份认证内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论