我们有一个Blazor Webassembly托管应用程序。针对我们自己的IdSrv4应用程序进行身份验证,它工作得很好。要实现基于角色和/或策略的基本授权不是问题,但这对我们来说已经足够了。根据他们的角色,每个用户都可以访问一个或多个"功能"。函数定义了对应用程序特定部分的访问(可能像字段级那样细粒度,也可能像工作流那样大)。
我找到的例子都很简单,比如如何创建一个"over21policy"。等等......这对我们来说是不可行的,因为我们有数百个这样的函数。我认为一定有一种方法可以将参数发送到策略需求并使其"动态"!?因此,考虑到经常构成示例的年龄策略,必须有一种方法可以使用该策略,例如"OverGivenAgePolicy(30)"。
我已经实现了AuthorizationHandler
MyAuthHandler : AuthorizationHandler<AccessFunctionRequirement>
覆盖
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context,
AccessFunctionRequirement requirement)
{
// Get functions for user
var functions = GetFunctionsForUser(userId);
// Check if the user has the required access function
if (functions.Any(f => f == requirement.AccessFunction))
context.Succeed(requirement);
}
}
,其中功能需求像
那样实现public class AccessFunctionRequirement : IAuthorizationRequirement
{
public AuthFunctions.AccessFunctions AccessFunction { get; }
public AccessFunctionRequirement(AuthFunctions.AccessFunctions accessFunc)
{
AccessFunction = accessFunc;
}
}
但是,现在问题出现了。当构建策略并将其添加到管道中时,我必须指定一个实际的AccessFunction:
public static AuthorizationPolicy HasAccessPolicy()
{
return new AuthorizationPolicyBuilder().RequireAuthenticatedUser()
.AddRequirements(new AccessFunctionRequirement(SOME_STATIC_ACCESSFUNCTION))
.Build();
}
显然,这并没有解决任何问题,因为它仍然需要和访问函数一样多的策略。另一个问题是,即使我可以将策略定义为"动态的",当在组件中使用策略时,我如何才能为这个特定组件/字段等添加所需的访问功能?
@attribute [Authorize(Policy = "HasAccessPolicy(NEEDS_TO_GIVE_FUNCTIONS_HERE)")]
这种授权必须是众所周知的,因为来自MS的示例实际上只适用于"Hello world";一种解决方案。那么,是否有一种方法可以继承Authorize属性并使其工作,尽管这样我仍然需要在DI初始化期间解决Policy的注册问题。
另一种可能性,很有可能,是我在所有这些中错过了一些非常基本的东西,这些东西会使这种场景的实现变得容易?
参见brian评论中的链接,希望这是一个体面的实现策略。