iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
0
Modern Web

我與 ASP.NET Core 的 30天系列 第 22

[Day22] 身份驗證與授權 - 我與 ASP.NET Core 3 的 30天

驗證與授權

驗證是一道程序,其會將使用者提供的認證與作業系統、資料庫、應用程式或資源中儲存的認證進行比對。如果相符的話,使用者就能成功通過驗證,並可執行他們在授權程序期間取得授權的動作。授權則是判斷使用者是否有權存取資源的程式。

簡單來說
驗證 (Authentication)就是讓系統認得你是誰
授權 (Authorization)讓系統判斷你是否有權限

ASP.NET Core中的驗證

在ASP.NET Core中,身份驗證由驗證Middleware中使用的IAuthenticationService處理。驗證服務會使用已註冊的驗證處理常式來完成驗證相關的動作。 驗證相關動作的範例包括:

  • 驗證使用者。
  • 當未驗證的使用者嘗試存取受限制的資源時回應。

驗證設定的方式是由Startup.ConfigureServices:
通過在使用services.AddAuthentication之後呼叫特定於方案的擴展方法(例如,例如AddJwtBearer或AddCookie)。 這些擴充方法會使用 AuthenticationBuilder AddScheme ,以適當的設定來註冊配置。
以下範例,在Startup.ConfigureServices加入下列內容

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => Configuration.Bind("JwtSettings", options))
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => Configuration.Bind("CookieSettings", options));

透過AddAuthentication註冊驗證的服務,並設定cookie及JWT的驗證配置。

如果使用多個配置,則授權策略(或授權屬性)可以指定它們要用來驗證用戶身份的驗證Scheme。
在上面的範例中,可以通過指定cookie身份驗證名稱來使用cookie身份驗證Scheme(默認情況下為CookieAuthenticationDefaults.AuthenticationScheme,但在呼叫AddCookie時可以提供其他名稱)。

透過呼叫UseAuthentication擴充方法,將身份驗證的Middleware加入到Startup.Configure當中。呼叫UseAuthentication會註冊使用先前註冊的身份驗證設定的Middleware。在依賴於身份驗證用戶的任何Middleware之前,請呼叫UseAuthentication。
使用端點路由時,對UseAuthentication的呼叫必須進行:

  • 在UseRouting之後,以便路由資訊可用於身份驗證決策。
  • 在UseEndpoints之前,以便在訪問端點之前對用戶進行身份驗證。

驗證後的處理方式

驗證完畢後,應該要搭配下列處理方式:

  • 如果驗證失敗,傳回「沒有結果」或「失敗」。
  • 如果驗證成功,則建立表示使用者身分識別的結構物件AuthenticationTicket。以範例來說:
    cookie從建立使用者身分識別的驗證配置cookie。
    JWT 持有人配置還原序列化和驗證 JWT 持有人Token,以建立使用者的身分識別。
  • 如果未經驗證就嘗試存取資源,則應該回傳「未經過授權」或是「未獲得驗證」。
    備註:「未經過授權」與「未獲得驗證」可以代表的http code分別是:未獲得驗證 401、未經過授權 403

身份驗證方式有多種方式可以實現

  • Cookie驗證
  • Token-bases驗證
  • Idetity 驗證
  • OAuth2 驗證
  • Windows 驗證

以下使用Cookie驗證作為驗證成功後建立驗證資訊的範例

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("FullName", user.FullName),
    new Claim(ClaimTypes.Role, "Administrator"),
};

var claimsIdentity = new ClaimsIdentity(
    claims, CookieAuthenticationDefaults.AuthenticationScheme);

var authProperties = new AuthenticationProperties
{
    // 在此設定Cookies相關細節,如過期時間...等
};

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity), 
    authProperties);

在ASP.NET Core 中的授權

ASP.NET Core 中的授權是由 AuthorizeAttribute 和其各種參數所控制。 將 [Authorize] 屬性套用至控制器、動作或頁面最簡單的形式, Razor會將該元件的存取限制為任何已驗證的使用者。
下列範例為ASP.NET Core的授權使用方式
在Controller中加入[Authorize]屬性,使Controller中每個Action都需要經過授權才能使用,其中,在Action上加入[AllowAnonymous]屬性,可以使個別Action允許未經驗證的使用者存取。

[Authorize]
public class AccountController : Controller
{
    [AllowAnonymous]
    public ActionResult Login()
    {
    }

    public ActionResult Logout()
    {
    }
}

也可以只針對某個Action套用[Authorize]屬性

public class AccountController : Controller
{
   public ActionResult Login()
   {
   }

   [Authorize]
   public ActionResult Logout()
   {
   }
}

授權也可針對每個使用者的角色,建立不同的權限。比如只有管理員有權限存取後台

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}

也可以對多個角色做設定(用,做區隔),並在Action上加以限制特定角色存取限制

[Authorize(Roles = "Administrator, Agent")]
public class AdministrationController : Controller
{
    public ActionResult Get()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult Update()
    {
    }
}

參考資料
Overview of ASP.NET Core Security


上一篇
[Day21] Cookie與Session - 我與 ASP.NET Core 3 的 30天
下一篇
[Day23] 本機快取與Redis快取 - 我與 ASP.NET Core 3 的 30天
系列文
我與 ASP.NET Core 的 30天31

尚未有邦友留言

立即登入留言