重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍“ASP.NET Core身份认证过程是如何实现的”,在日常操作中,相信很多人在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负责,身份验证服务会调用已注册的身份验证处理程序来完成与身份验证相关的操作, 整个验证过程由认证中间件来串联。
其中有几个关键步骤
1、认证处理程序
可结合方案Scheme中的配置项AuthenticationSchemeOptions编写认证处理程序。
基于Cookie的认证方案可在Options项中可指定登录地址,
基于基本身份的认证方案可在Options项中指定用户名/密码;
2、身份认证程序继承自AuthenticationHandler类或IAuthenticationHandler接口。
核心认证函数可落地基于声明的访问控制,生成绑定了ClaimsPrincipal、Scheme的AuthenticationTicket对象; 无论认证成功/失败,函数返回AuthenticateResult对象。
挑战(对未认证的用户做出的反应): 例如返回登录页面
禁止(对已认证,但对特定资源无权访问做出的反应) : 例如返回提示字符串
以上均为服务注册过程
收到请求,认证中间件使用IAuthenticationService对HttpContext按照要求的scheme进行认证, 实际内部会调用第2步编写的认证处理程序。
以上认证原理,之前有一个近身实战: ASP.NET Core 实现基本身份验证。
源代码如下:/tupian/20230522/ppstrong3 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_users; public UserEntityService(IHttpContextAccessor accessor, IDefaultMongoDatabaseProvider databaseProvider) { _accessor = accessor; _users = databaseProvider.GetCollection (CollectionNames.UserProfiles); } public Task GetCurrentUserAsync() { var rawUser = this._accessor.HttpContext.User(); if (rawUser == null) { return null; } var filter = Builders .Filter.Eq("UserId", rawUser.UserId); return _users.Find(filter).FirstOrDefaultAsync(); } }
我们不需要区分以上代码场合,在Controller或者Application 服务中使用ICurrentUser接口拿到登录用户。
旁白
个人认为,ASP.NET Core身份认证的源代码, 基于现实认知提炼而来,让我们惊叹于框架代码的的简洁精炼、层次分明。
基于声明的访问控制已成标准,ASP.NET Core/abp vnext 均提供了完善的支持。
到此,关于“ASP.NET Core身份认证过程是如何实现的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!