编辑:
如果您具有读取权限的角色,第一个解决方案也可以使用。
通过阅读文档,我唯一能想到的其他解决方案是实现接口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/en-us/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] 添加到控制器或特定端点函数即可。