影片講解
教到這邊或許可以來進入身分驗證的部分,也就是登入登出,相信登入登出對一個網站而言大多是必備功能。
那基本上在WebAPI裡可以簡單分成兩種驗證方式
- 使用Cookie驗證
- 使用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