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

vai*_*dil 7 c# asp.net-core-mvc asp.net-core asp.net-core-webapi

我正在.NET Core 1.1中构建一个API.我在基本控制器中构建了一个自定义User对象HttpContext.User,我的所有其他控制器都是从该控制器继承的,并且我默认启用了身份验证(必须[AllowAnonymous]在必要时手动禁用).该User对象具有IsAdmin属性.现在我正在检查用户是否是每个相关功能顶部的管理员,如下所示,但我觉得必须有一种方法来添加自定义属性来简化和清理此代码.

供参考,User.IsAdmin是这方面的简写:

bool.Parse(HttpContext.User.FindFirst("IsAdmin")?.Value)
Run Code Online (Sandbox Code Playgroud)

而不是这个:

[HttpGet]
public async Task<IActionResult> Get()
{
    if (!User.IsAdmin)
        return Forbid();

    // logic
}
Run Code Online (Sandbox Code Playgroud)

我喜欢这个(或类似的东西):

[AdminOnly]
[HttpGet]
public async Task<IActionResult> Get()
{
    // logic
}
Run Code Online (Sandbox Code Playgroud)

我试着查看源代码[AuthorizeAttribute]来尝试构建,但它只是一个shell而且我不知道真正的魔法在哪里发生.

我怎么能做到这一点?

Luk*_*wej 8

@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();
    })
);
Run Code Online (Sandbox Code Playgroud)


然后只需将其用作属性:

[Authorize("PolicyName")]
Run Code Online (Sandbox Code Playgroud)