详细说明Cookie权限认证

张开发
2026/4/16 19:16:54 15 分钟阅读

分享文章

详细说明Cookie权限认证
Cookie的鉴权授权第一步 了解用户声明的基础类1、 ClaimTypes类 是微软已经给我们定义好的一些常见字符串变量用来表示 一些用户元素比如姓名、地址、角色、电话等等。2、Claim类表示一个基本的信息需要使用 ClaimTypes类ClaimTypes类中定义好了基本的元素名称创建Claim类就需要为元素赋值。Claim创建成功就是记录了一个基本信息如下// 创建一个表示用户名称的声明ClaimnameClaimnewClaim(ClaimTypes.Name,John Doe);3、ClaimsIdentity 类可以将 ClaimsIdentity 看作是一个“证件”比如身份证或驾照。他是包含多个Claim声明例如身份证 包含 姓名张三 、电话123、地址重庆等等每个 ClaimsIdentity 包含一组相关的声明Claims身份验证类型AuthenticationType是否已认证IsAuthenticated名称Name创建ClaimsIdentity 示例//创建 基本信息 集合varclaimsnewListClaim{newClaim(ClaimTypes.Name,user.Username)newClaim(ClaimTypes.Role,role)};//创建声明身份、或者说证件//并指定认证身份验证方案 为CookieAuthvarclaimsIdentitynewClaimsIdentity(claims,CookieAuth);4、ClaimsPrincipal类ClaimsPrincipal 则可以看作是证件持有者可以包含多个 ClaimsIdentity。一个 ClaimsPrincipal 可以持有多个不同的身份例如身份证、驾照、护照等每个身份都由一个 ClaimsIdentity 表示。两者关系‌包含关系‌一个 ClaimsPrincipal 可以包含多个 ClaimsIdentity而每个 ClaimsIdentity 包含多个 Claim。‌持有关系‌ClaimsPrincipal 持有并管理一个或多个 ClaimsIdentity。‌层次结构‌Claim 是最小单位ClaimsIdentity 是证件ClaimsPrincipal 是证件持有者。5、AuthenticationProperties 类它本质上是一个键值对的字典它的各个属性是用来设置或者保存认证过程中的附加信息这些属性可以被认证中间件和处理程序使用。核心属性‌Items‌一个字典用于存储自定义的键值对数据这些数据可以包含任何与认证会话相关的额外信息。‌IsPersistent‌指示认证是否持久化即是否应该在用户关闭浏览器后仍然保持认证状态。‌RedirectUri‌指定认证完成后重定向的 URI常用于登录后返回原始请求的页面。‌ExpiresUtc‌设置认证的过期时间。‌IssuedUtc‌设置认证的颁发时间。看懂以上信息就完成Cookie认证的一大半啦。第二步服务注册先看代码// Add authentication services//添加身份认证服务builder.Services.AddAuthentication(CookieAuth).AddCookie(CookieAuth,options{options.Cookie.NameCookieAuthExample.Cookie;options.ExpireTimeSpanTimeSpan.FromMinutes(30);options.LoginPath/Account/Login;options.LogoutPath/Account/Logout;options.AccessDeniedPath/Account/AccessDenied;options.SlidingExpirationtrue;options.Cookie.SecurePolicybuilder.Environment.IsDevelopment()?CookieSecurePolicy.SameAsRequest:CookieSecurePolicy.Always;options.Cookie.SameSiteSameSiteMode.Strict;options.Cookie.HttpOnlytrue;});// Add authorization services//添加授权服务builder.Services.AddAuthorization();varappbuilder.Build();// Add authentication middleware before authorization//启动身份认证app.UseAuthentication();//启用权限认证app.UseAuthorization();app.Run();1、必须在var app builder.Build()之前 添加身份认证服务和授权服务在var app builder.Build()之后 启用 身份认证和权限认证。2、解释说明builder.Services.AddAuthentication(“CookieAuth”) 这句 代码的意思是添加身份认证、并且命名为CookieAuth “CookieAuth” 是认证方案的名称AddCookie 方法配置了 Cookie 认证的具体行为如登录路径、登出路径和访问被拒绝的路径等。第三步在控制器中使用1、在登陆方法中先查询数据数据库中是否有用户信息、如果没有直接返回错误信息2、如果查询用户信息无误2.1、就创建你需要的个多Claims用于保存信息2.2、创建ClaimsIdentity将Claims存入ClaimsIdentity并指定认证方案的名称例如varclaimsIdentitynewClaimsIdentity(claims,CookieAuth);2.3、创建 AuthenticationProperties2.4、 HttpContext.SignInAsync() 方法用于用户登录创建并设置认证 Cookie。ASP.NET Core 应用程序中执行用户登录操作通过创建并设置身份验证 Cookie 来标识已认证的用户。核心功能当调用 SignInAsync 时它会触发以下操作‌身份验证处理程序调用‌根据指定的身份验证方案如 “CookieAuth”系统会查找并调用相应的认证处理程序例如 Cookie认证处理程序。 ‌声明编码与 Cookie 创建‌认证处理程序会将 ClaimsPrincipal中的声明信息进行编码并根据配置的选项如 Cookie 名称、过期时间、安全策略等创建一个认证 Cookie。客户端存储‌创建的认证 Cookie 会被发送回客户端浏览器浏览器会在后续请求中自动将其包含在请求头中。 ‌会话状态管理‌通过Cookie服务器可以识别用户身份实现会话状态管理。之后你的会话中就会包含 你写入的Cookie信息啦2.5、HttpContext.SignOutAsync() 方法用于用户登出清除认证 Cookie。用于‌执行用户登出操作清除身份验证 Cookie‌从而使用户从应用程序中注销。核心作用当调用 HttpContext.SignOutAsync() 时它会触发以下关键操作‌清除认证 Cookie‌该方法会删除存储在客户端浏览器中的认证 Cookie这个 Cookie 通常是在用户登录时通过 SignInAsync 方法创建的。删除 Cookie 后用户将不再被识别为已认证用户。‌结束认证会话‌通过清除认证 Cookie系统会结束当前用户的认证会话状态用户需要重新进行身份验证才能访问受保护的资源。‌调用认证处理程序‌该方法会根据指定的身份验证方案如 “CookieAuth” 或CookieAuthenticationDefaults.AuthenticationScheme调用相应的认证处理程序来执行登出逻辑。使用方式SignOutAsync 方法通常与特定的身份验证方案名称一起使用以确保正确地清除对应的认证信息例如publicasyncTaskIActionResultLogout(){//CookieAuth为认证方案的名称awaitHttpContext.SignOutAsync(CookieAuth);returnRedirectToAction(Index,Home);}以下是控制器中使用Cookie认证的完整示例publicclassAccountController:Controller{privatereadonlyUserStorage_userStorage;publicAccountController(UserStorageuserStorage){_userStorageuserStorage;}[HttpGet]publicIActionResultLogin(stringreturnUrlnull){ViewData[ReturnUrl]returnUrl;returnView();}[HttpPost]publicasyncTaskIActionResultLogin(stringusername,stringpassword,stringreturnUrlnull){ViewData[ReturnUrl]returnUrl;if(string.IsNullOrEmpty(username)||string.IsNullOrEmpty(password)){ModelState.AddModelError(string.Empty,Username and password are required);returnView();}varuser_userStorage.GetUserByUsername(username);if(usernull||!_userStorage.ValidatePassword(user,password)){ModelState.AddModelError(string.Empty,Invalid username or password);returnView();}varclaimsnewListClaim{newClaim(ClaimTypes.Name,user.Username)};foreach(varroleinuser.Roles){claims.Add(newClaim(ClaimTypes.Role,role));}varclaimsIdentitynewClaimsIdentity(claims,CookieAuth);varauthPropertiesnewAuthenticationProperties{IsPersistentfalse,ExpiresUtcDateTimeOffset.UtcNow.AddMinutes(30)};awaitHttpContext.SignInAsync(CookieAuth,newClaimsPrincipal(claimsIdentity),authProperties);if(!string.IsNullOrEmpty(returnUrl)Url.IsLocalUrl(returnUrl)){returnRedirect(returnUrl);}else{returnRedirectToAction(Index,Home);}}[HttpPost]publicasyncTaskIActionResultLogout(){awaitHttpContext.SignOutAsync(CookieAuth);returnRedirectToAction(Index,Home);}[HttpGet]publicIActionResultAccessDenied(){returnView();}}第四步 标记认证特性最后便是在你的控制器上或者方法上打上认证特性1、[Authorize(Roles “User,Admin”)] //两者是或者的关系满足一个即可2、打上两个标记两者必须同时生效才能授权通过在方法上打上认证特性[Authorize(RolesUser,Admin)]//两者是或者的关系满足一个即可//[Authorize(Roles User)]//[Authorize(Roles Admin)] //标记两个两者必须同时生效才能授权通过publicIActionResultIndex1(){returnView(~/Views/Sixth/index.cshtml);}在整个控制器类上打上认证特性[Authorize(RolesUser)]publicclassUserController:Controller{publicIActionResultIndex(){ViewData[Username]User.Identity?.Name??Unknown;ViewData[Roles]string.Join(, ,User.Claims.Where(cc.TypeSystem.Security.Claims.ClaimTypes.Role).Select(cc.Value));returnView();}publicIActionResultUserOnlyAction(){returnView();}}

更多文章