演示:基于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 对象,表示用户的身份。
//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

posted @   AI大胜  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示