【问题标题】:Create dynamic authorization policies in Blazor Webassembly在 Blazor Webassembly 中创建动态授权策略
【发布时间】: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 的注册。

另一种可能性,很可能,是我错过了所有这一切的一些非常基本的东西,这将使这种场景的实施变得容易?

【问题讨论】:

标签: authorization asp.net-identity blazor webassembly


【解决方案1】:

请参阅 Brians 评论中的链接,这有望构成一个体面的实施策略。

【讨论】:

  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
猜你喜欢
  • 2023-01-20
  • 2021-02-08
  • 2021-12-27
  • 2020-09-23
  • 2021-09-17
  • 2019-10-03
  • 2021-06-29
  • 2021-03-27
  • 2021-09-05
相关资源
最近更新 更多