允许进行身份验证的属性



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

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

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

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

在旧的.NET身份中,我可以用AuthorizeAttribute做到这一点,但在.NET核心中,需求/策略似乎是最好的选择。

我在Startup.cs中使用了FallbackPolicy来确保所有端点都受到经过身份验证的用户的保护:

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

我通过添加回退策略解决了这个问题:

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;
}
}

相关内容

  • 没有找到相关文章

最新更新