共用方式為


關於 .NET 微服務和 Web 應用程式中的授權

小提示

此內容是適用於容器化 .NET 應用程式的電子書.NET 微服務架構摘錄,可在 .NET Docs 或免費下載的 PDF 中取得,可脫機讀取。

.NET 微服務架構的容器化 .NET 應用程式電子書封面縮圖。

驗證之後,ASP.NET Core Web API 需要授權存取權。 這個程序允許服務向某些已驗證的使用者提供 API,但不是所有使用者。 授權 可以根據使用者的角色或自定義原則來完成,這可能包括檢查權利要求或其他啟發式方法。

限制對 ASP.NET Core MVC 路由的存取很簡單,就像將 Authorize 屬性套用至動作方法一樣簡單(如果所有控制器的動作都需要授權,則套用至控制器的 類別),如下列範例所示:

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

    [Authorize]
    public ActionResult Logout()
    {
    }
}

根據預設,新增沒有參數的 Authorize 屬性將會限制對該控制器或動作的已驗證使用者存取。 若要進一步限制只能供特定使用者使用的 API,可以展開 屬性,以指定使用者必須滿足的必要角色或原則。

實作角色型授權

ASP.NET Core Identity 具有角色的內建概念。 除了使用者之外,ASP.NET Core Identity 會儲存應用程式所使用的不同角色相關信息,並追蹤哪些使用者被指派給哪些角色。 可以透過程式設計使用RoleManager類型來變更指派,該類型會更新持久化儲存中的角色,以及使用UserManager類型來授予或撤銷使用者角色。

如果您要使用 JWT 持有人令牌進行驗證,ASP.NET Core JWT 持有人驗證中間件會根據令牌中找到的角色宣告填入使用者的角色。 若要將MVC動作或控制器的存取限制為特定角色中的使用者,您可以在授權批註 (屬性) 中包含 Roles 參數,如下列代碼段所示:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

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

在此範例中,只有系統管理員或PowerUser角色中的使用者才能存取ControlPanel控制器中的API(例如執行SetTime動作)。 關閉 API 會進一步限制為只允許系統管理員角色中的使用者存取。

若要要求使用者處於多個角色,您可以使用多個 Authorize 屬性,如下列範例所示:

[Authorize(Roles = "Administrator, PowerUser")]
[Authorize(Roles = "RemoteEmployee ")]
[Authorize(Policy = "CustomPolicy")]
public ActionResult API1 ()
{
}

在此範例中,若要呼叫 API1,用戶必須:

  • 在系統管理員 PowerUser 角色中,

  • 在 RemoteEmployee 角色中,

  • 滿足 CustomPolicy 授權的自定義處理程式。

實作原則型授權

自訂授權規則也可以使用 授權原則撰寫。 本節提供概觀。 如需詳細資訊,請參閱 ASP.NET 授權研討會

自定義授權原則在 Startup.ConfigureServices 方法中使用 AddAuthorization 方法註冊。 這個方法會接受委派來設定 AuthorizationOptions 自變數。

services.AddAuthorization(options =>
{
    options.AddPolicy("AdministratorsOnly", policy =>
        policy.RequireRole("Administrator"));

    options.AddPolicy("EmployeesOnly", policy =>
        policy.RequireClaim("EmployeeNumber"));

    options.AddPolicy("Over21", policy =>
        policy.Requirements.Add(new MinimumAgeRequirement(21)));
});

如範例所示,原則可以與不同類型的需求相關聯。 註冊原則後,可以藉由將原則名稱作為 Policy 參數指定,在授權屬性中套用該原則至動作或控制器。原則可以具備多項要求,而不僅限於一項(如這些範例所示)。

在上一個範例中,第一個 AddPolicy 呼叫只是依角色授權的替代方式。 如果 [Authorize(Policy="AdministratorsOnly")] 套用至 API,則只有系統管理員角色中的使用者才能存取它。

第二次 AddPolicy 呼叫演示了一種要求用戶必須具備特定主張的簡單方法。 方法 RequireClaim 也會選擇性地接受宣告的預期值。 如果有指定值,則只有當用戶同時有正確類型的宣告以及其中一個指定的值時,才符合要求。 如果您使用 JWT 持有人驗證中間件,所有 JWT 屬性都會以使用者宣告的形式提供。

這裏顯示最有趣的原則是在第三 AddPolicy 個方法中,因為它使用自定義授權需求。 藉由使用自定義授權需求,您可以大幅控制如何執行授權。 若要這樣做,您必須實作這些類型:

如果使用者符合需求,對的呼叫 context.Succeed 會指出用戶已獲得授權。 如果用戶有多種方式可能滿足授權需求,則可以建立多個處理程式。

除了向AddPolicy呼叫註冊自訂原則需求之外,您還需要透過依賴注入(services.AddTransient<IAuthorizationHandler, MinimumAgeHandler>())註冊自訂需求處理程式。

ASP.NET Core 授權文件中提供一個用於檢查用戶年齡的自定義授權需求和處理常式範例(基於DateOfBirth宣告)。

授權和最小 API

ASP.NET 支援最小 API 作為控制器型 API 的替代方案。 授權原則是設定最低 API 授權的建議方式,如下列範例所示:

// Program.cs
builder.Services.AddAuthorizationBuilder()
  .AddPolicy("admin_greetings", policy =>
        policy
            .RequireRole("admin")
            .RequireScope("greetings_api"));

// build the app

app.MapGet("/hello", () => "Hello world!")
  .RequireAuthorization("admin_greetings");

其他資源