演示:基于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

浙公网安备 33010602011771号