演示:基于Cookie的认证
有人说:如果我们的应用只考虑浏览器使用,且不考虑前后端分离,cookie是最简单的身份验证方式。
注意:ASP.NET Core 的认证系统旨在构建一个标准的模型,用来完成针对请求的认证以及与之相关的登录和注销操作。
认证实现在名为 AuthenticationMiddleware 的中间件中。在Startup.cs中调用两个方法,
注册器依赖的服务:AddAuthentication ()
添加中间件:UseAuthorization ()
该中间件负责在请求阶段尝试从请求中获取用户标识(票据),若获取到则赋值给HttpContext.User
属性,否则以匿名用户身份继续执行下一个中间件。
创建一个Cookie认证,需要用到几个对象:
Claim
声明常常代表认证用户身份的元数据信息,比如手机号、邮箱、用户名等等。
ClaimsIdentity
声明主体,代表一个认证用户的身份证,当然包含声明的集合。
ClaimsPrincipal
表示身份证持有者。
认证主要会使用 AuthenticationHttpContextExtensions 类,它是基于HttpContext上的公开身份认证的扩展方法:
方法 | 描述 |
---|---|
SignInAsync | 登录用户。用户登录成功后颁发一个证书(加密的用户凭证,这个凭证放入Cookie中),用来标识用户的身份 |
SignOutAsync | 注销退出.清除Cookie |
GetTokenAsync | 用来获取 AuthenticationProperties 中保存的额外信息 |
ForbidAsync | 通知用户权限不足,如果是ajax请求返回403状态码,不是ajax请求跳转指定的url |
ChallengeAsync | 通知用户需要登录。在默认实现类AuthenticationHandler中,返回401 |
AuthenticateAsync | 验证在 SignInAsync 中颁发的证书,并返回一个 AuthenticateResult 对象,表示用户的身份。 |
代码示例:如何使用基于 Cookie 的认证
//startup.cs public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); //ASP.NET Core 基于Cookie的认证 string CookieScheme = CookieAuthenticationDefaults.AuthenticationScheme; services.AddAuthentication(CookieScheme) .AddCookie(CookieScheme, options => { options.LoginPath = "/account/login"; options.LogoutPath = "/account/logout"; }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //…… app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=SessionTest}/{id?}"); }); }
在注册认证中间件基础服务时,还设置了默认采用的认证方案,对认证方案的注册是通过 AddAuthentication 方法返回的一个 AuthenticationBuilder 对象来实现的。上面代码片段中,调用 AuthenticationBuilder 对象的 AddCookie 扩展方法完成了针对 Cookie 认证方案的注册。
判断登录状态:
使用属性 HttpContext.User?.Identity?.IsAuthenticated
进行登录和注销:
通过调用 HttpContext 的 SignInAsync 和 SignOutAsync
登录和注销的默认路径
基于 Cookie 的认证方案中,默认采用的url路径:
- 登录:Account/Login
- 注销:Account/Logout
关键代码
if (context?.User?.Identity?.IsAuthenticated == true) { //已认证的请求的后续操作…… } else { //未认证的匿名请求,你自定义后续处理,比如转到登录: await context.ChallengeAsync(); }
HttpContext?.User?.Identity?.IsAuthenticated
该属性指定当前请求是否已经过认证。
参考:https://www.cnblogs.com/artech/
更新于:2023-05-09
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?