我正在建立一个dotnet核心网站,最近开始使用基于声明的身份验证和授权。
在视图组件中,我正在检查用户是否可以访问策略。
上市 …
通过在指向正确方向后仔细查看Microsoft文档,我设法解决了这个问题。
https://github.com/aspnet/Docs/blob/master/aspnetcore/security/authorization/iauthorizationpolicyprovider.md#multiple-authorization-policy-providers
使用自定义IAuthorizationPolicyProvider实现时,请记住ASP.NET Core仅使用IAuthorizationPolicyProvider的一个实例。如果自定义提供程序无法为所有策略名称提供授权策略,则应该回退到备份提供程序。
结果我改变了我的实施 HasPermissionPolicyProvider 至 CustomPolicyProvider 内容如下:
HasPermissionPolicyProvider
CustomPolicyProvider
public class CustomPolicyProvider : DefaultAuthorizationPolicyProvider { private const string PermissionPolicyPrefix = "HasPermission"; public CustomPolicyProvider(IOptions<AuthorizationOptions> options) : base(options) { } public override async Task<AuthorizationPolicy> GetPolicyAsync(string policyName) { var policy = await base.GetPolicyAsync(policyName); if (policy != null) return policy; if (policyName.StartsWith(PermissionPolicyPrefix, StringComparison.OrdinalIgnoreCase)) { var permission = policyName.Substring(PermissionPolicyPrefix.Length); return new AuthorizationPolicyBuilder() .AddRequirements(new HasPermissionRequirement(permission)) .Build(); } return null; } }
这意味着您只能拥有一个必须处理所有逻辑的PolicyProvider。如果需要多个处理程序逻辑,则更改是确保它调用默认实现。