簡單介紹.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();
}
}
做身分權限就是這麼簡單、快速又輕鬆,
學起來下次遇到就可以早點下班囉。
如上述有誤,煩請指教。