也许我的问题没有很好地表述,但我想知道如何创建一个 Blazor 授权策略,该策略在用户满足至少 1 项声明时有效,而不是必须满足策略中指定的所有声明。
我的代码目前是这样的:
builder.Services.AddAuthorization(options =>
{
// By default, all incoming requests will be authorized according to the default policy
options.FallbackPolicy = options.DefaultPolicy;
options.AddPolicy("AdminsAndMods", policy =>
{
policy.RequireClaim("Admin", "true");
//policy.RequireClaim("Moderator", "true"); // I want the policy to be valid for admins and for moderators
});
});
如果我取消选中代码中的第二个“RequireClaim”,它将要求用户既是管理员又是主持人,但我希望如果用户至少拥有这两个声明中的一项,则根据策略进行验证。
我知道我可以使用角色来代替,并且角色可以在
您需要使用实现多个
IAuthorizationRequirement
的 AuthorizationHandler
。
这是我从一个项目中取出的一个。它测试用户 ID 是否在记录的所有者字段中定义,或者是否具有管理员角色。如果满足其中一个要求,则要求成功。
public class RecordManagerAuthorizationRequirement : IAuthorizationRequirement { }
public class RecordOwnerManagerAuthorizationHandler : AuthorizationHandler<RecordManagerAuthorizationRequirement, AppAuthFields>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RecordManagerAuthorizationRequirement requirement, AppAuthFields data)
{
var entityId = context.User.GetIdentityId();
if (entityId != Guid.Empty && entityId == data.OwnerId)
context.Succeed(requirement);
return Task.CompletedTask;
}
}
public class RecordManagerAuthorizationHandler : AuthorizationHandler<RecordManagerAuthorizationRequirement, AppAuthFields>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RecordManagerAuthorizationRequirement requirement, AppAuthFields data)
{
if (context.User.IsInRole(AppPolicies.AdminRole))
context.Succeed(requirement);
return Task.CompletedTask;
}
}
然后您可以定义策略:
public static AuthorizationPolicy IsManagerAuthorizationPolicy
=> new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddRequirements(new RecordManagerAuthorizationRequirement())
.Build();
如果您想查看此代码的上下文,这里有一个存储库:https://github.com/ShaunCurtis/Blazr.Demo.Authorization