Asp.net core中使用cookie身份驗(yàn)證
本文轉(zhuǎn)載自微信公眾號「UP技術(shù)控」,作者conan5566。轉(zhuǎn)載本文請聯(lián)系UP技術(shù)控公眾號。conan5566
背景
ASP.NET Core Identity 是一個完整的全功能身份驗(yàn)證提供程序,用于創(chuàng)建和維護(hù)登錄名。 但是, cookie 不能使用基于的身份驗(yàn)證提供程序 ASP.NET Core Identity 。
配置
在 Startup.ConfigureServices 方法中,創(chuàng)建具有 AddAuthentication 和 AddCookie 方法的身份驗(yàn)證中間件服務(wù):
- services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
 
- app.UseAuthentication();
 
AuthenticationScheme 傳遞到 AddAuthentication 設(shè)置應(yīng)用程序的默認(rèn)身份驗(yàn)證方案。如果有多個 cookie 身份驗(yàn)證實(shí)例,并且你想要使用特定方案進(jìn)行授權(quán),AuthenticationScheme 會很有用。將 AuthenticationScheme 設(shè)置為CookieAuthenticationDefaults。AuthenticationScheme為方案提供值 "cookie"??梢蕴峁┤魏斡糜趨^(qū)分方案的字符串值。
應(yīng)用的身份驗(yàn)證方案不同于應(yīng)用的 cookie 身份驗(yàn)證方案。如果未向 AddCookie提供 cookie 身份驗(yàn)證方案,則使用 CookieAuthenticationDefaults.AuthenticationScheme ("Cookie")。
默認(rèn)情況下,身份驗(yàn)證 cookie 的 IsEssential 屬性設(shè)置為 true。當(dāng)站點(diǎn)訪問者未同意數(shù)據(jù)收集時(shí),允許使用身份驗(yàn)證 cookie。
登錄
若要創(chuàng)建保存用戶信息的 cookie,請構(gòu)造一個 ClaimsPrincipal。將對用戶信息進(jìn)行序列化并將其存儲在 cookie 中。
使用任何所需的 Claim創(chuàng)建 ClaimsIdentity,并調(diào)用 SignInAsync 以登錄用戶:
- /// <summary>
 - ///
 - /// </summary>
 - /// <param name="model"></param>
 - /// <param name="returnUrl"></param>
 - /// <returns></returns>
 - [HttpPost]
 - [AllowAttribute]
 - [ValidateAntiForgeryToken]
 - public async Task<IActionResult> Login(LoginModel model, string returnUrl = null)
 - {
 - if (!ModelState.IsValid)
 - {
 - return Json(new { state = "error", message = "數(shù)據(jù)驗(yàn)證失敗" });
 - }
 - string ip = GetRemoteIpAddress();
 - var r = await UserApp.SaasLoginAsync(model.Account, model.Password, ip);
 - if (!string.IsNullOrEmpty(r.Error))
 - {
 - return Json(new { state = "error", message = r.Error });
 - }
 - var claims = new List<Claim>
 - {
 - new Claim(ClaimTypes.UserData, getCurrentUser(r.User, ip).ToString()),
 - };
 - var claimsIdentity = new ClaimsIdentity(
 - claims, CookieAuthenticationDefaults.AuthenticationScheme);
 - var authProperties = new AuthenticationProperties
 - {
 - ExpiresUtc = DateTimeOffset.Now.AddMinutes(120)
 - };
 - await HttpContext.SignInAsync(
 - CookieAuthenticationDefaults.AuthenticationScheme,
 - new ClaimsPrincipal(claimsIdentity),
 - authProperties);
 - return Json(new { state = "success", message = "登錄成功。", returnUrl = RedirectToLocal(returnUrl) });
 - }
 
SignInAsync 創(chuàng)建加密的 cookie,并將其添加到當(dāng)前響應(yīng)中。如果未指定 AuthenticationScheme,則使用默認(rèn)方案。 ASP.NET Core 的數(shù)據(jù)保護(hù)系統(tǒng)用于加密。對于托管在多臺計(jì)算機(jī)上的應(yīng)用程序、跨應(yīng)用程序或使用 web  場進(jìn)行負(fù)載平衡,請將數(shù)據(jù)保護(hù)配置為使用相同的密鑰環(huán)和應(yīng)用程序標(biāo)識符。 注銷 若要注銷當(dāng)前用戶并刪除其 cookie,請調(diào)用 SignOutAsync: 參考資料 https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/?view=aspnetcore-5.0















 
 
 

 
 
 
 