asp.net core認證與授權:授權

 ASP.NET Core 授權系統中的三種授權方式:PolicyRolesAuthenticationSchemes

基於角色的授權

基於角色的授權,我們都比較熟悉,使用方式如下:

[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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章