首页 > 解决方案 > 允许属性进行身份验证

问题描述

几乎我所有的 API 端点都只能由内部用户使用,这是默认场景,他们需要这种访问权限。当我创建一个新端点时,他们将需要访问该端点。

我也有一些特殊的外部用户可以登录,但只使用其中的几个端点,比如说 10%。

不必创建允许除外部用户之外的所有用户访问的要求/策略(通过使用策略装饰每个 API 路由,[Authorize(Policy = "InternalOnly")]我可以创建策略(或类似于 的属性[AllowAnonymous]),我只在外部的 API 端点上放置允许访问的用户,例如:

[Route("GetForExternal")]
[HttpPost]
[ExternalAllowed]
public async Task<ActionResult<String>> GetForExternal(Request request)

在旧的 .NET 身份中,我可以使用 .NET 来做到这一点AuthorizeAttribute,但在 .NET 核心中,要求/策略似乎是要走的路。

我使用了一个FallbackPolicyinStartup.cs来确保所有端点都受到经过身份验证的用户的保护:

services.AddAuthorization(options =>
            {
                options.FallbackPolicy = new AuthorizationPolicyBuilder()
                                         .RequireAuthenticatedUser()
                                         .Build();
            });

标签: .net.net-coreasp.net-identity

解决方案


我通过添加后备策略解决了这个问题:

services.AddAuthorization(options =>
{
    options.AddPolicy(Policies.AllowExternal, policy => policy.RequireAuthenticatedUser().Requirements.Add(new AllowExternalRequirement()));

    options.FallbackPolicy = new AuthorizationPolicyBuilder()
                             .RequireAuthenticatedUser()
                             .RequireRole("InternalEmployee")
                             .Build();
});

并使用策略装饰外部允许的 api 端点: [Authorize(Policy = Policies.AllowExternal)]

然后添加一个简单的覆盖策略:

public class AllowExternalRequirement : IAuthorizationRequirement
{
}

public class AllowExternalHandler : AuthorizationHandler<AllowExternalRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AllowExternalRequirement requirement)
    {
        context.Succeed(requirement);
        return Task.CompletedTask;
    }
}

推荐阅读