首页 > 解决方案 > 禁用某些页面的全局 IAuthorizationRequirement

问题描述

我有一个自定义 IAuthorizationRequirement 实现,我想根据用户的租户声明简单地验证用户是否被允许访问该页面。

public class TenantAccessRequirement : IAuthorizationRequirement
{
}

实际租户将在 AuthorizationHandler 中解析。此 IAuthorizationRequirement 在 Startup AddAuthorizationMethod 中全局应用

 services.AddAuthorization(options =>
        {
            options.DefaultPolicy = new AuthorizationPolicyBuilder()
                .RequireClaim(AuthorizationConstants.TenantIdClaimType)
                .RequireAuthenticatedUser()
                .AddRequirements(new TenantAccessRequirement())
                .Build();
        });

有些页面不是特定于租户的,所以我想覆盖要求,授权/允许匿名的工作方式相同。我怎样才能做到这一点?我不想从全局策略中删除租户访问要求,因为只有几个页面不是特定于租户的。最好的方法是覆盖 TenantaccessRequirement 的另一个属性。

我正在考虑的一个选项是为相同的要求注册另一个处理程序,并检查上下文的要求是否包含匿名租户要求。

        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TenantAccessRequirement requirement)
    {
        if (context.Requirements.Any(r => r.GetType() == typeof(AnonymousTenantRequirement)))
        {
            context.Succeed(requirement);
        }
    }

但这似乎有点脏,因为 AnonymousTenantRequirement 不是实际要求。

标签: asp.net-coreauthorizationasp.net-core-3.1

解决方案


推荐阅读