ASP.NET Core 授權系統中的三種授權方式:Policy
, Roles
, AuthenticationSchemes
基於角色的授權
基於角色的授權,我們都比較熟悉,使用方式如下:
[Authorize(Roles = "Admin")] // 多個Role可以使用,分割
public class SampleDataController : Controller
{
...
}
基於角色的授權的邏輯與ASP.NET 4.x類似,都是使用我在《初識認證》中介紹的IsInRole
方法來實現的。
基於Scheme的授權
對於AuthenticationScheme我在前面幾章也都介紹過,比如Cookie認證默認使用的AuthenticationScheme就是Cookies
,在JwtBearer認證中,默認的Scheme就是Bearer
。
當初在學習認證時,還在疑惑,如何在使用Cookie認證的同時又支持Bearer認證呢?在認證中明明只能設置一個Scheme來執行。當看到這裏時,豁然開朗,後面會詳細介紹。
[Authorize(AuthenticationSchemes = "Cookies")] // 多個Scheme可以使用,分割
public class SampleDataController : Controller
{
...
}
當我們的應用程序中,同時使用了多種認證Scheme時,AuthenticationScheme授權就非常有用,在該授權模式下,會通過context.AuthenticateAsync(scheme)
重新獲取Claims。
基於策略的授權
在ASP.NET Core中,重新設計了一種更加靈活的授權方式:基於策略的授權,也是授權的核心。
在使用基於策略的授權時,首先要定義授權策略,而授權策略本質上就是對Claims的一系列斷言。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});
}
重點記錄基於策略的授權,最爲靈活,也是其他兩種授權模式的核心。
demo地址:https://gitee.com/xiaoqingyao/authentication-netcore/tree/master/Authorization-Policy
策略控制非常靈活,可以是直接判斷是否存在某個claim,也可以是判定claim的值,還可以是組合來判斷。
services.AddAuthorization(options => { //會員身份驗證 options.AddPolicy("MemberOnly", p => { //p.RequireClaim("MemberCardCode"); p.RequireClaim("Name");//必須包含某個Claim項 }); //必須包含某個Claim項 options.AddPolicy("User", policy => policy .RequireAssertion(context => context.User.HasClaim(c => (c.Type == "EmployeeNumber" || c.Type == "Role"))) ); //綜合控制 options.AddPolicy("Employee", policy => policy .RequireRole("Admin")//角色 .RequireUserName("Alice")//身份驗證 .RequireClaim("EmployeeNumber")//必須包含某個Claim項 .Combine(commonPolicy));//合併其他策略 //自定義策略 options.AddPolicy("Over18", p => p.Requirements.Add(new MinimumAgeRequirement(18))); //多Handler驗證 options.AddPolicy("Anbu", p => p.Requirements.Add(new AnBuEnterRequirement())); });
源:https://www.cnblogs.com/RainingNight/p/authorization-in-asp-net-core.html