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

参见英文答案 > How do you create a custom AuthorizeAttribute in ASP.NET Core?6个
我正在.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]尝试构建,但它只是一个shell,我不知道真正的魔法发生在哪里.

我怎么能做到这一点?

解决方法

@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的概念,先从...
基于 .NET 的一个全新的、好用的 PHP SDK + Runtime: Pe...
.NET 异步工作原理介绍。
引子 .NET 6 开始初步引入 PGO。PGO 即 Profile Guided Opti...
前言 2021/4/8 .NET 6 Preview 3 发布,这个版本的改进大多来...
前言 开头防杠:.NET 的基础库、语言、运行时团队从来都是相...