首先需要Model設定想要的驗證annotaition,目的用來檢驗帳號、密碼格式。
【舉例】
帳號要Email格式
密碼至少要6個字以上
Model Code:
public class LoginViewModel
{
[Required]
[EmailAddress]
public string UserName { get; set; }
[Display(Name = "密碼")]
[StringLength(100, ErrorMessage = " {0} 至少要 {2} 字", MinimumLength = 6)]
[DataType(DataType.Password)]
public string Password { get; set; }
}
在Action + ModelState.IsValid
做驗證判斷+動作,這段跟asp.net mvc沒有差別
public IActionResult Login(LoginViewModel model)
{
if (ModelState.IsValid )
{
/*驗證成功動作*/
}
/*驗證失敗動作*/
}
不一樣的是可以用TagHelper:asp-validation-summary
<div asp-validation-summary="All"></div>
當驗證錯誤會自動渲染錯誤畫面在前端網頁,告知用戶錯在哪
當在Action + ValidateAntiForgeryToken
annotation,會自動在Form
標籤內生成"防偽token"(注意:是全部的Form標籤都會生成),防止跨站請求偽造
[ValidateAntiForgeryToken]
public IActionResult Login(LoginViewModel model)
{
//..略
}
[AllowAnonymous]意思允許未經驗證,可以正常讀取Action頁面
主要用在登入,避免還沒有登入還沒取得權限,無法使用登入功能。
配合[Authorize]可以添加在想要驗證的Action,假如沒有登入權限跳回需要驗證的動作。
詳細可以閱讀ASP.NET Core 簡單的授權
要使用以上驗證,需要在Startup.cs - ConfigureServices方法裡註冊服務:像是miniblog使用Cookie驗證,AddCookie
簡單註冊登入、登出連結..等功能。
public void ConfigureServices(IServiceCollection services){
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/login/";
options.LogoutPath = "/logout/";
});
//..略
}
配合CookieAuthenticationDefaults.AuthenticationScheme
當參數,跟字面上意思一樣易懂,HttpContext.SignInAsyncy做登入;HttpContext.SignOutAsync做登出。
登入使用Cookie需要傳遞使用者驗證資料,需要用到Claim, ClaimsIdentity, ClaimsPrincipal
。
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim(ClaimTypes.Name, 使用者名稱));
var principle = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync(principle);
以MSDN解釋理解
ClaimsIdentity是駕照,ClaimsPrincipal是駕照持有人,Claim是駕照內容
假如下次登入紀錄帳號密碼,可以使用AuthenticationProperties
,增加參數在上列code:
//..略
var properties = new AuthenticationProperties {IsPersistent = true};/*是否登入記憶*/
await HttpContext.SignInAsync(principle, properties);
除此之外需要記憶的地方,可以使用RazorPageBase.User.Identity.IsAuthenticated
在cshtml頁面,做是否有登入過後權限判斷,如下面Code:
<dvi>
@if (User.Identity.IsAuthenticated)
{
<div>//顯示擁有權限的功能</div>
}
</div>