Contents

.Net Core Identity 做 Authorize

驗證與授權是很常用在帳號登入權限判斷,驗證(Authientication)授權(Authorization)要先瞭解這兩個名詞才能順暢了解範例在做什麼。

驗證與授權關係

驗證(Authientication)

判斷是否有登入帳號資訊

授權(Authorization)

判斷使用者是否能有網頁資源(Resource)。不是只驗證使用者帳號,重點是否有權限進入頁面。

以上簡單用自己了解說明。詳細可Google查詢。
了解這兩個名詞在實作接下來內容才可能比較清楚

Authorize 屬性

GIT: AccountManage 加入授權設定 · malagege/NetCoreAuthSample@bc5bb3f

Controller 用上[Authorize]就可以判斷使用者能否取得資源。這邊可以用來判斷使用者是否登入過帳號,這邊可以針對角色做調整,後續文章會在整理。

可在class上面加上[Authorize],每個 method 都會做授權判斷。也可以獨立在 method 做。

多角色授權注意事項

下面為 Admin或 User 角色可以授權此類別。

1
2
3
4
[Authorize(Roles = "Admin,User")]
public class AController:Controller{

}

下面為Admin和User兩者角色符合才能授權此類別。

1
2
3
4
5
[Authorize(Roles = "Admin")]
[Authorize(Roles = "User")]
public class AController:Controller{

}

使用上需要注意。

全局授權驗證

Middleware 設定做確認授權動作

參考:ASP.NET Core中以原則為基礎的授權 | Microsoft Docs

1
2
3
4
5
app.UseEndpoints(endpoints =>
{
    // equivalent of [Authorize] attribute on each controller:
    endpoints.MapDefaultControllerRoute().RequireAuthorization();
});

filter 註冊

1
2
3
4
public void ConfigureServices(IServiceCollection services)
{
     //全局添加AuthorizeFilter 过滤器方式
     services.AddControllers(options=>options.Filters.Add(new AuthorizeFilter()));

參考:Asp.Net Core Authorize你不知道的那些事(源码解读) - Jlion - 博客园
推薦好奇源碼怎麼做到,可以看裡面內容

AccessDenied 訪問頁面

GIT: AccessDenied 拒絕訪問功能 · malagege/NetCoreAuthSample@066d9d2

我們暫時 Authorize 把 Roles 加上隨便一個角色,如下方程式碼。

1
2
3
4
namespace AuthSample.Controllers
{
    [Authorize(Roles = "Admin")]
    public class AdminController : Controller

開啟http://localhost:50000/admin/rolelist會倒到http://localhost:50000/Account/AccessDenied?ReturnUrl=%2Fadmin%2Frolelist。這邊可以看到得到404結果。

https://i.imgur.com/9j90WVU.png

這邊我們要寫死一個類別方法,在AuthSample\Controllers\AccountController.cs
有面新增一個AccessDenied方法,在AuthSample\Views\Account\AccessDenied.cshtml顯示錯誤訊息。

1
2
3
4
5
6
7
    public class AccountController : Controller
    {

        public IActionResult AccessDenied()
        {
            return View();
        }

AuthSample\Views\Account\AccessDenied.cshtml

1
2
3
<div>
    <h1>無權限訪問</h1>
</div>

https://i.imgur.com/I7ErTUE.png

API 錯誤回應

這個用在 WebAPI感決怪怪的。我在Authentication In An ASP.NET Core API - Part 1: Identity, Access Denied | Pioneer Code有看到解決方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
services.Configure<IdentityOptions>(config =>
{
  config.Cookies.ApplicationCookie.Events =
  new CookieAuthenticationEvents
  {
      OnRedirectToLogin = ctx =>
      {
          if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == 200)
          {
              ctx.Response.StatusCode = 401;
              return Task.FromResult<object>(null);
          }
 
          ctx.Response.Redirect(ctx.RedirectUri);
          return Task.FromResult<object>(null);
      }
  };
});

其他參考:[ASP.NET Core] 啟用 UseAuthentication 後,讓MVC及API驗證失敗時有不同的行為 | Ian Chen - 點部落

但我看很多 API 都純後端可能沒加 CookieAuthenticationDefaultsm 驗證,所以可有做這個驗證。

.NET Core 2.0 Cookie Events OnRedirectToLogin - Stack Overflow

AllowAnonymous 屬性

GIT: AccountManage 加入授權設定 · malagege/NetCoreAuthSample@bc5bb3f

做 Authorize 動作的class有些方法需排除驗證授權,這邊需要加上[AllowAnonymous]

登入失敗會自動導入登入頁

GIT: 登入導向頁面 · malagege/NetCoreAuthSample@62198ab

http://localhost:50000/AccountManage/
像是會自動導回http://localhost:50000/Account/Login?ReturnUrl=%2FAccountManage%2F

所以login需要特別做ReturnUrl處理。

相關文章

Asp.Net Core Authorize你不知道的那些事(源码解读) - Jlion - 博客园

[Day14] ASP.NET Core 2 系列 - Filters - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

ASP.NET Core中如何定制AuthorizeAttribute 備份圖

自訂 AuthorizationMiddleware 的行為 | Microsoft Docs