[英]Is there a way to add role-based authentication in ASP.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.