几乎所有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;
}
}