1. 程式人生 > 程式設計 >asp.net core中如何使用cookie身份驗證

asp.net core中如何使用cookie身份驗證

背景

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:

 /// <summary>
  ///
  /// </summary>
  /// <returns></returns>
  [HttpPost]
  [ValidateAntiForgeryToken]
  public async Task<IActionResult> LogOff()
  {
   if (bool.Parse(Configuration.GetSection("IsIdentity").Value))
   {
    return SignOut("Cookies","oidc");
   }
   else
   {
    if (User.Identity.IsAuthenticated)
    {
     string userdata = User.Claims.FirstOrDefault(o => o.Type == ClaimTypes.UserData)?.Value;
     await UserApp.LogOffAsync(CurrentUser.FromJson(userdata));
    }
    await HttpContext.SignOutAsync(
     CookieAuthenticationDefaults.AuthenticationScheme);
    return RedirectToAction(actionName: nameof(Login),controllerName: "Account");
   }
  }

參考資料

https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/?view=aspnetcore-5.0

到此這篇關於asp.net core中如何使用cookie身份驗證的文章就介紹到這了,更多相關asp.net core用cookie身份驗證內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!