iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 16
2

16.Miniblog.Core:簡單權限驗證

資安關鍵字:

ModelState.IsValid

首先需要Model設定想要的驗證annotaition,目的用來檢驗帳號、密碼格式。
【舉例】
帳號要Email格式
2018-10-16.22.28.35-image.png
密碼至少要6個字以上
2018-10-16.22.31.21-image.png
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>  

當驗證錯誤會自動渲染錯誤畫面在前端網頁,告知用戶錯在哪
2018-10-16.22.43.03-image.png


ValidateAntiForgeryToken

當在Action + ValidateAntiForgeryToken annotation,會自動在Form標籤內生成"防偽token"(注意:是全部的Form標籤都會生成),防止跨站請求偽造

[ValidateAntiForgeryToken]
public IActionResult Login(LoginViewModel model)
{
    //..略
}

2018-10-16.22.53.59-image.png


[AllowAnonymous]、[Authorize]

[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/";  
        });  
    //..略  
 }  

HttpContext.SignInAsync、HttpContext.SignOutAsync;

配合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>  

上一篇
15.Miniblog.Core.W3C:支持SQLite
下一篇
17.抓取用戶IT鐵人賽文章
系列文
輕量高效.NET Core開源Blog引擎:Miniblog.Core30

尚未有邦友留言

立即登入留言