.NET Core 中的自定义授权属性 [重复]
Posted
技术标签:
【中文标题】.NET Core 中的自定义授权属性 [重复]【英文标题】:Custom authorization attribute in .NET Core [duplicate] 【发布时间】:2017-05-22 10:04:06 【问题描述】:我正在 .NET Core 1.1 中构建 API。我在我所有其他控制器都继承自的基本控制器中从HttpContext.User
构建了一个自定义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]
以尝试构建,但它只是一个外壳,我不知道真正的魔法发生在哪里。
我怎样才能做到这一点?
【问题讨论】:
我建议阅读有关基于策略的授权的文档,您基本上使用带有命名策略的属性,然后在启动时定义策略以要求某些角色或声明或其他规则docs.microsoft.com/en-us/aspnet/core/security/authorization/… 查看@blowdart 的答案(负责 ASP.NET Core 安全),您不应该(或需要)创建自己的属性 @JoeAudette 看起来这就是我需要的,不知道我是怎么错过的。 :/ Claims-based auth 会起作用,因为我只需要验证声明是true
。如果您将其添加为答案,我会接受。
【参考方案1】:
@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")]
【讨论】:
以上是关于.NET Core 中的自定义授权属性 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何创建不依赖于 ASP.NET Core 声明的自定义 Authorize 属性?
IsAuthenticated 在自定义授权属性(.NET Core 2.2 和 JSON Web 令牌)中始终为 false