簡體   English   中英

.NET Core Web API中基於角色的讀/寫訪問

[英]Role-based read/write access in .NET Core Web API

我想創建這種訪問的平淡無奇的方式,在這種情況下,權利下降了:

已驗證 :只能發出GET請求。
帶有角色“雇員”的自動鍍膜 :還具有對一個特定控制器的寫訪問權限。
帶有角色“ admin”的授權 :在每個控制器上都有讀/寫功能。

到目前為止,我僅遇到自定義策略需要某些角色的解決方案。 然后通過以下方法將此策略應用於控制器: [Authorize(Roles = "Role")] 此解決方案的問題是,即使我全局需要管理員角色,我也必須向所有HttpGet操作添加“只讀”策略。

我想消除有人忘記或不小心刪除控制器上的[Authorize]屬性的可能性。

我正在尋找一種解決方案,其中全局設置的策略將允許我根據角色和http動詞來限制訪問。 類似於我們在設置CORS時所做的,下面的偽代碼:

var getPolicy = new RoleBasedPolicyBuilder()
    .AnyRole().AllowHttpMethod("GET");

var employeePolicy = new RoleBasedPolicyBuilder()
    .Role("employee").AllowController(EmployeeController);

var writePolicy = new RoleBasedPolicyBuilder()
    .Role("admin").AllowAnyHttpMethod();

o.Filters.Add(new AuthorizeFilter(getPolicy));
o.Filters.Add(new AuthorizeFilter(employeePolicy));
o.Filters.Add(new AuthorizeFilter(writePolicy));

編輯:

如果您甚至具有讀取訪問權的角色,第一個解決方案將起作用。 通過查看文檔,我只能弄清的其他解決方案是實現IAsyncAuthorizationFilter接口。

public class TestAuthorizeHandler : IAsyncAuthorizationFilter
{
    private readonly string[] methodsThatDoNotRequireSpecialRoles =
    {
        "OPTIONS",
        "HEAD",
        "GET",
    };

    private const string PostMethod = "POST";

    public Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        // we don't need users to be authenticated for routes that contain this filter
        if (context.Filters.Any(filter => filter is IAllowAnonymousFilter))
        {
            return Task.CompletedTask;
        }

        var requestMethod = context.HttpContext.Request.Method;

        // we don't want to check authorization for the given methods
        if (methodsThatDoNotRequireSpecialRoles.Any(method => method == requestMethod))
        {
            return Task.CompletedTask;
        }

        if (requestMethod == TestAuthorizeHandler.PostMethod && context.HttpContext.User.IsInRole("MyWriteMethodRoles"))
        {
            return Task.CompletedTask;
        }

        context.Result = new ForbidResult();
        return Task.CompletedTask;
    }
}

現在在您的ConfigureServices(...)函數中添加一個mvc過濾器

public void ConfigureServices(IServiceCollection services)
{
   services.AddMvc(options => {
      options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build()));
      options.Filters.Add(typeof(TestAuthorizeHandler));
   }
}

另請參閱https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/policies,以了解可能可行的更多方案。

先前的建議:

添加一個全局過濾器,該過濾器要求在您的ConfigureService(...)函數中對用戶進行授權

public void ConfigureServices(IServiceCollection services)
{
   services.AddMvc(options => {
      options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder()
.AddRequirements(new RolesAuthorizationRequirement(new []{ "role1", "role2"}))
                    .RequireAuthenticatedUser()
                    .Build()));
   });
}

現在,每個控制器路徑都需要使用您的一個角色進行授權。 如果您需要某些端點具有特定角色,則仍然需要進行設置。 如果您不希望在某些路由中使用,則只需將[AllowAnonymous]添加到控制器或特定的端點函數中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM