.NET Core中的自定义授权属性

时间:2017-01-07 20:18:00

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

我在.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]尝试构建,但它只是一个外壳,我不知道真正的魔法在哪里发生。

我该如何做到这一点?

1 个答案:

答案 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")]