我在.NET Core 1.1中构建API。我在基本控制器中从User
构建了一个自定义HttpContext.User
对象,我的所有其他控制器都继承自该对象,并且我默认启用了身份验证(必要时必须手动禁用[AllowAnonymous]
) 。 User
对象具有IsAdmin
属性。现在我正在检查用户是否是下面每个相关功能顶部的管理员,但我觉得必须有一种方法来添加自定义属性来简化和清理此代码。
作为参考,User.IsAdmin
是此简写:
bool.Parse(HttpContext.User.FindFirst("IsAdmin")?.Value)
而不是:
[HttpGet]
public async Task<IActionResult> Get()
{
if (!User.IsAdmin)
return Forbid();
// logic
}
我喜欢这个(或类似的东西):
[AdminOnly]
[HttpGet]
public async Task<IActionResult> Get()
{
// logic
}
我试着看source for [AuthorizeAttribute]
尝试构建,但它只是一个外壳,我不知道真正的魔法在哪里发生。
我该如何做到这一点?
答案 0 :(得分:8)
@JoeAudette建议的解决方案似乎是最佳选择。
在Startup.cs
ConfigureServices()中创建自己的策略:
services.AddAuthorization(options =>
options.AddPolicy("PolicyName", p =>
{
p.RequireAuthenticatedUser();
p.RequireClaim("IsAdmin", true); <- your criteria here (claim type, claim value) ???
p.Build();
})
);
然后将其用作属性:
[Authorize("PolicyName")]