【发布时间】:2018-08-29 14:34:15
【问题描述】:
我不确定如何在 ASP.NET Core 授权中实现组合的“OR”要求。在以前的 ASP.NET 版本中,这将通过角色来完成,但我试图通过声明来做到这一点,部分原因是为了更好地理解它。
用户有一个名为 AccountType 的枚举,它将提供对控制器/操作/等的不同级别的访问。类型分为三个级别,分别称为 User、BiggerUser 和 BiggestUser。所以 BiggestUser 可以访问他们下面的帐户类型所拥有的所有内容,依此类推。我想通过使用策略的授权标签来实现这一点。
所以首先我有一个要求:
public class TypeRequirement : IAuthorizationRequirement
{
public TypeRequirement(AccountTypes account)
{
Account = account;
}
public AccountTypes Account { get; }
}
我创建策略:
services.AddAuthorization(options =>
{
options.AddPolicy("UserRights", policy =>
policy.AddRequirements(new TypeRequirement(AccountTypes.User));
});
通用处理程序:
public class TypeHandler : AuthorizationHandler<TypeRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TypeRequirement requirement)
{
if (!context.User.HasClaim(c => c.Type == "AccountTypes"))
{
context.Fail();
}
string claimValue = context.User.FindFirst(c => c.Type == "AccountTypes").Value;
AccountTypes claimAsType = (AccountTypes)Enum.Parse(typeof(AccountTypes), claimValue);
if (claimAsType == requirement.Account)
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
}
我要做的是向策略中添加多个要求,使 任何 项都可以满足它。但我目前的理解是,如果我这样做:
options.AddPolicy("UserRights", policy => policy.AddRequirements(
new TypeRequirement(AccountTypes.User),
new TypeRequirement(AccountTypes.BiggerUser)
);
两个要求都必须得到满足。如果在 AddRequirements 中以某种方式指定 OR 条件,我的处理程序将起作用。那么我是在正确的轨道上还是有其他更有意义的实现方式?
【问题讨论】:
-
假设您有 2 个策略 strongA 和 strongB。它们分别需要 claimA 和 claimB。您需要一个为已经可以使用 strongA 或 strongB 的用户完成的策略。然后,我想到的解决方案是: - 1) 有一个新的声明 claimC - 2) 更改 strongA 和 strongB 以便它们都需要 claimC。 - 3) 将claimC 授予已经拥有claimA 或claimB 的所有用户(现在您又回到了原来的设置)。最后 。 4) 创建新的策略 lightC ,只需要 claimC -> 现在所有满足策略 strongA 或 strongB 的用户也将满足策略 lightC
-
为了让这个项目继续进行,我现在只在一个处理程序中完成这一切,这只是一组非常不雅的 if(this requirements){check for these type} 对每种帐户类型重复一次。
标签: asp.net-core-2.0