.net - 允许属性进行身份验证
问题描述
几乎我所有的 API 端点都只能由内部用户使用,这是默认场景,他们需要这种访问权限。当我创建一个新端点时,他们将需要访问该端点。
我也有一些特殊的外部用户可以登录,但只使用其中的几个端点,比如说 10%。
不必创建允许除外部用户之外的所有用户访问的要求/策略(通过使用策略装饰每个 API 路由,[Authorize(Policy = "InternalOnly")]
我可以创建策略(或类似于 的属性[AllowAnonymous]
),我只在外部的 API 端点上放置允许访问的用户,例如:
[Route("GetForExternal")]
[HttpPost]
[ExternalAllowed]
public async Task<ActionResult<String>> GetForExternal(Request request)
在旧的 .NET 身份中,我可以使用 .NET 来做到这一点AuthorizeAttribute
,但在 .NET 核心中,要求/策略似乎是要走的路。
我使用了一个FallbackPolicy
inStartup.cs
来确保所有端点都受到经过身份验证的用户的保护:
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;
}
}
推荐阅读
- python - 树莓派不提供音频输出
- vba - VBA 遍历名称/地址列表以自动创建相同的发票
- java - 创建 CaptureSession 后是否可以添加和删除 Surfaces?
- angular - 如何重新加载 PWA 缓存?- Angular 11 PWA、Chrome Android
- jquery - 使用 ajax 向 django 服务器发送数据时出现问题
- typescript - Typeorm查找查询不返回ManyToOne关系ID
- c# - .net 5 中的哪些变化使它在 foreach 中更改字典值时不会抛出
- reactjs - 如何将用户创建的数组传递给另一个组件?
- flutter - 为什么不将颜色属性传递给 TextButton?
- python - 我如何在控制台中写一条简短的错误消息并完全在文件中