[.NET Core]如何製作身分識別及授權

簡單介紹.NET Core Filter流程以及如何快速實作身分識別及授權。
 

說明身分識別之前,首先我們要先了解一下Filter的種類,
Filter總共有五種,分別為:

1. Authorization Filter 
作用:當Request進入系統時驗證是否合法。

2. Resource Filter 
作用:當在執行Model Binding前需要特別處理資料時使用。

3. Result Filter 
作用:當Action執行完成後Response的最後一關。

4.  Action Filter
作用:Action的生命週期,包含了:OnActionExecuting 、OnActionExecuted 、OnResultExecuting 、OnResultExecuted 。

5. Exception Filter
作用:捕捉系統所產生的Excepiton。

下圖為Filter的流程:

當產生Request時會依序經過,
Middleware > Authorization Filter> Resource Filter> Model Binding > Action Filter,
而當Action執行完成後則會經過 Result Filter > Resource Filter,
有沒有很困惑Exception Filter何時產生呢?

其實答案很簡單,也就是當你的Action Execute產生Exception就會經過Exception Filter了。

 

那麼回到正題,到底該怎麼做驗證呢?
在一開始微軟的MVC專案內,最簡單的驗證方式就是加上Attribute Authorize,

[Authorize]
public IActionResult Index()
{
    return View();
}

上述的方法可以讓你快速的驗證使用者是否登入,而來達到最簡易的身分識別功能。

那如何授權呢?
根據微軟提供的方式只要這樣就可以了。

[Authorize(Roles="Admin")]
public IActionResult Index()
{
    return View();
}

雖然上面所說的方法可以快速提供身分識別及授權,但卻不夠彈性,

試想:
如果身分一多該怎麼設定?如果權限設置在資料庫內怎麼辦?
難道要一個一個Action去做設定嗎?

這時候就輪到我們的Filter出場了!
任何一個進入到Action前的Filter都可以做,
但我們應該要選擇正確的Filter,也就是Authorization Filter,
如果不知道為什麼要麻煩拉上去看看Filter的作用哦。

 

進入實作

首先建立一個Class,叫做CustomAuthorizationorization,
並且繼承:

1. Attribute

2. IAuthorizationFilter

由於IAuthorizationFilter是一個介面並沒有實作,所以我們要去實作OnAuthorization這個功能,

public class CustomAuthorizationorization: Attribute, IAuthorizationFilter    
{
​    public void OnAuthorization(AuthorizationFilterContext context)        
    {    
        // TODO ...         
    }    
}

實作完後就可以…

「為所欲為」的圖片搜尋結果

例如這樣:

public void OnAuthorization(AuthorizationFilterContext context)        
{            
    var controllerName = context.RouteData.Values["Controller"];            
    var actionName = context.RouteData.Values["Action"];        
   
    // 判斷使用者是否登入            
    if (!context.HttpContext.User.Identity.IsAuthenticated)            
    {                
        // 沒有登入 HttpStatusCode = 401 尚未授權                
        context.Result =
            new RedirectResult($"~/{(int)HttpStatusCode.Unauthorized}");            
    }        
}

然後在Controller加上後,就可以又做辨識又做授權。
[CustomAuthorizationorization]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

 

做身分權限就是這麼簡單、快速又輕鬆,
學起來下次遇到就可以早點下班囉。

 

 

 

如上述有誤,煩請指教。