12-1.ASP.NET Core Web API 入門教學 - 使用 cookie 驗證但不使用 ASP.NET Core Identity(實作登入登出)

ASP.NET Core Web API 入門教學

影片講解


教到這邊或許可以來進入身分驗證的部分,也就是登入登出,相信登入登出對一個網站而言大多是必備功能。

那基本上在WebAPI裡可以簡單分成兩種驗證方式

  1. 使用Cookie驗證
  2. 使用Token驗證

那兩種所適用的地方跟做法都大不相同,而WebAPI網路上常見到的驗證方式JWT就是Token驗證的一種實現方式,不過今天這篇是要來示範cookie驗證方式,Token方式我之後的文章會在示範。

那本次的Cookie驗證機制,會使用.NET Core內建的機制來實作示範給大家看。

不過講到.NET Core內建的驗證機制,可能有些人會搜尋到ASP.NET Core Identity,但對於新手來說,想要學習Identity過於困難,也不太適合放在入門教學,所以就先示範這個簡易型的驗證方式,雖然說是簡易型的,但要完成大部分中小型網站的驗證需求,基本上是沒有太大問題。

首先我們先到Startup.cs加入以下設定。

public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(option =>
                {
                    //未登入時會自動導到這個網址
                    option.LoginPath = new PathString("/api/Login/NoLogin");
                });        
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
   //順序要一樣
   app.UseCookiePolicy();
   app.UseAuthentication();
   app.UseAuthorization();
}

接著我們在創立一個新的API,LoginController.cs,為了示範方便這邊就不將程式寫在Service裡面了。

那首先我們登入就要驗證使用者是不是存在,那基本上不存在或帳密錯誤我們訊息都回一樣的,以防止透漏太多資訊給使用者來try你的程式。

[HttpPost]
public string login(LoginPost value)
{
    var user = (from a in _todoContext.Employees
                where a.Account == value.Account
                && a.Password == value.Password
                select a).SingleOrDefault();

    if (user == null)
    {
        return "帳號密碼錯誤";
    }
    else
    {
    //這邊等等寫驗證
    }
}
public class LoginPost{
    public string Account { get; set; }
    public string Password { get; set; }
}

上面如果user不等於空的時候,代表使用者帳密是正確的,那接下來就要做身分確認的流程。

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

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

通過以上程式就會完成登入。那我們這邊順便先寫一下登出跟未登入的頁面。

[HttpDelete]
public void logout()
{     HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
[HttpGet("NoLogin")]
public string noLogin()
{
    return "未登入";
}

那接著我們該如何讓我們的api有著身分登入驗證的效果呢?很簡單只要在你的api上面加上[Authorize],如下。

[Authorize]
[HttpGet]
public IActionResult Get([FromQuery] TodoSelectParameter value){
}

這樣我們讀取GET /api/Todo就會如下圖,程式會自動導到/api/Login/NoLogin這個網址。

那我們在POST /api/login打入正確的帳密,會出現ok回應。

此時再次讀取/api/Todo,就讀的到資料了。

那執行DELETE /api/login,就會被登出了。

以上就是內建的cookie驗證的簡易示範,相信非常直覺又好懂。

不過還有幾個小技巧要講的,就是基本上大多數的api都會用到登入驗證,那我們如果要在每一支都加上[Authorize]會太過繁瑣,所以我們可以到Startup.cs設定全域套用,如下。

services.AddMvc(options =>
{
    options.Filters.Add(new AuthorizeFilter());
});

但這麼一來還有一個問題,就是變成我們登入的api也不能使用了,所以這邊就需要在我們登入的api上方加上[AllowAnonymous]。

[Route("api/[controller]")]
[ApiController]
[AllowAnonymous]
public class LoginController : ControllerBase
{
}

如此這支api就不會受驗證的影響了。

以上就是簡單的示範,想要更詳細的實作流程可以看影片。

新手分享學習成果,若有錯誤,煩請告知修正,感謝🙏

範例檔:下載


參考資料:
使用 cookie 驗證但不使用 ASP.NET Core Identity
ASP.NET Core 簡介 Identity




Copyright © 凱哥寫程式 2022 | Powered by TalllKai ❤