1 回答
TA贡献1829条经验 获得超9个赞
我不知道什么对您不起作用,但这就是您使用 AuthorizationService 的方式。
对于此示例,我们假设您在启动时定义了一个策略:
services.AddAuthorization(options =>
{
// assume that claimtype of role is role.
options.AddPolicy("MyRolePolicy", policy => policy.RequireClaim("role", "SomeRole"));
});
这意味着受“MyRolePolicy”限制的代码;仅当用户具有角色“SomeRole”时才可访问。相当于 User.IsInRole("SomeRole")。
在视图中注入服务并测试用户的策略:
@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService _authorizationService
@if ((await _authorizationService.AuthorizeAsync(User, "MyRolePolicy")).Succeeded)
{
}
当您使用自定义授权策略提供程序时,策略是通过中间件添加的,例如:
public class AuthorizationPolicyProvider : DefaultAuthorizationPolicyProvider
{
public AuthorizationPolicyProvider(IOptions<AuthorizationOptions> options) : base(options)
{
}
public async override Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
{
// check static policies first
var policy = await base.GetPolicyAsync(policyName);
if (policy == null)
return new AuthorizationPolicyBuilder().AddRequirements(new PermissionRequirement(policyName)).Build();
return policy;
}
}
在此示例中,策略将添加为权限(如果不存在),其中声明类型为 permission,值为策略名称。当我添加政策 MyPermission 时,它将检查声明类型 permission 的值 MyPermission。
视图中:
@if ((await _authorizationService.AuthorizeAsync(User, "MyPermission")).Succeeded)
{
}
我不确定您所说的“它也不是策略”是什么意思,但授权策略提供程序返回策略。因此,您应该能够验证这些策略。无论是简单的声明类型(例如权限或角色)还是带有参数的更复杂的策略。但名称必须匹配。还要确保注入必要的处理程序、服务等。
更新
您还可以使用要求进行验证:
@if ((await _authorizationService.AuthorizeAsync(User, null, new MinimumAgeRequirement(15))).Succeeded)
其中MinimumAgeRequirement 是要求本身。
如记录:
AuthorizeAsync(ClaimsPrincipal, Object, IEnumerable<IAuthorizationRequirement>)
检查用户是否满足特定的一组要求 指定资源
- 1 回答
- 0 关注
- 95 浏览
添加回答
举报