【问题标题】:Custom authorization attribute in .NET Core [duplicate].NET Core 中的自定义授权属性 [重复]
【发布时间】: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。如果您将其添加为答案,我会接受。

标签: c# asp.net-core asp.net-core-mvc asp.net-core-webapi


【解决方案1】:

@JoeAudette 建议的解决方案似乎是最佳选择。


Startup.csConfigureServices() 中创建您自己的策略:

services.AddAuthorization(options => 
    options.AddPolicy("PolicyName", p =>
    {
        p.RequireAuthenticatedUser();
        p.RequireClaim("IsAdmin", true); <- your criteria here (claim type, claim value) ???
        p.Build();
    })
);


然后将其用作属性:

[Authorize("PolicyName")]

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2017-11-16
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多