驗證之後,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 個方法中,因為它使用自定義授權需求。 藉由使用自定義授權需求,您可以大幅控制如何執行授權。 若要這樣做,您必須實作這些類型:
衍生自 IAuthorizationRequirement 且包含指定需求詳細數據之欄位的需求類型。 在此範例中,這是範例
MinimumAgeRequirement類型的年齡欄位。實作的 AuthorizationHandler<TRequirement>處理程式,其中 T 是處理程式可滿足的 IAuthorizationRequirement 型別。 處理程式必須實 HandleRequirementAsync 作 方法,以檢查包含使用者相關信息的指定內容是否符合需求。
如果使用者符合需求,對的呼叫 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");
其他資源
ASP.NET 核心驗證
https://learn.microsoft.com/aspnet/core/security/authentication/identityASP.NET 核心授權
https://learn.microsoft.com/aspnet/core/security/authorization/introduction角色型授權
https://learn.microsoft.com/aspnet/core/security/authorization/roles自定義原則型授權
https://learn.microsoft.com/aspnet/core/security/authorization/policies最低 API 中的驗證和授權 \ https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis/security