【发布时间】:2021-11-05 04:39:59
【问题描述】:
我们有一个 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 的注册。
另一种可能性,很可能,是我错过了所有这一切的一些非常基本的东西,这将使这种场景的实施变得容易?
【问题讨论】:
-
@BrianParker,是的,实际上我昨天在发布这篇文章后发现了那篇文章。将尝试实施。
标签: authorization asp.net-identity blazor webassembly