Code Apprentice

Single Page Application session-based 驗證

· [Jack Shih]

基本上談到 SPA 大部分人推崇的會是使用 JWT 做驗證,不過要用 JWT 做驗證要考慮到的事情可多的。是不是值得把原本 session 作的事情拿回來自己做也是需要考慮的。 後來才發現其實也是可以直接使用原來的 cookie-session 的驗證也是 ok,而且反而簡單很多。 也許是因為太簡單所以網路上查不太到資料吧,所以在這邊紀錄一下。

直接參照 M$ 官方網站的教學

startup.cs 內的 ConfigureService 中加入

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options => {
      options.Cookie.name = "CookieName";
      options.Cookie.path = "/";
      options.Events.OnRedirectToLogin = (context) =>
      {
          // 把未登入的自動轉頁複寫掉
          context.Response.StatusCode = 401;
          return Task.CompletedTask;
      }
    });

然後在 Configure 中加在 usespaservice 上面

app.UseAuthentication();

基本上就跟 MVC 平常一樣。

登入

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("FullName", user.FullName),
    new Claim(ClaimTypes.Role, "Administrator"),
};

var claimsIdentity = new ClaimsIdentity(
    claims, CookieAuthenticationDefaults.AuthenticationScheme);

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity));

登出

await HttpContext.SignOutAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

JS fetch

fetch(url, {
  credentials: "same-origin"
}).then(...);

Reference

http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions https://docs.microsoft.com/zh-tw/aspnet/core/security/authentication/cookie https://stackoverflow.com/questions/46247163/net-core-2-0-cookie-authentication-do-not-redirect https://stackoverflow.com/questions/34558264/fetch-api-with-cookie