Asp.net core中使用cookie身份驗證
本文轉載自微信公眾號「UP技術控」,作者conan5566。轉載本文請聯系UP技術控公眾號。conan5566
背景
ASP.NET Core Identity 是一個完整的全功能身份驗證提供程序,用于創建和維護登錄名。 但是, cookie 不能使用基于的身份驗證提供程序 ASP.NET Core Identity 。
配置
在 Startup.ConfigureServices 方法中,創建具有 AddAuthentication 和 AddCookie 方法的身份驗證中間件服務:
- services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
- app.UseAuthentication();
AuthenticationScheme 傳遞到 AddAuthentication 設置應用程序的默認身份驗證方案。如果有多個 cookie 身份驗證實例,并且你想要使用特定方案進行授權,AuthenticationScheme 會很有用。將 AuthenticationScheme 設置為CookieAuthenticationDefaults。AuthenticationScheme為方案提供值 "cookie"。可以提供任何用于區分方案的字符串值。
應用的身份驗證方案不同于應用的 cookie 身份驗證方案。如果未向 AddCookie提供 cookie 身份驗證方案,則使用 CookieAuthenticationDefaults.AuthenticationScheme ("Cookie")。
默認情況下,身份驗證 cookie 的 IsEssential 屬性設置為 true。當站點訪問者未同意數據收集時,允許使用身份驗證 cookie。
登錄
若要創建保存用戶信息的 cookie,請構造一個 ClaimsPrincipal。將對用戶信息進行序列化并將其存儲在 cookie 中。
使用任何所需的 Claim創建 ClaimsIdentity,并調用 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 = "數據驗證失敗" });
- }
- 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 創建加密的 cookie,并將其添加到當前響應中。如果未指定 AuthenticationScheme,則使用默認方案。 ASP.NET Core 的數據保護系統用于加密。對于托管在多臺計算機上的應用程序、跨應用程序或使用 web 場進行負載平衡,請將數據保護配置為使用相同的密鑰環和應用程序標識符。 注銷 若要注銷當前用戶并刪除其 cookie,請調用 SignOutAsync: 參考資料 https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/?view=aspnetcore-5.0