在 ASP.Net Identity 中使用声明而不是策略进行授权

Pie*_*tro 3 claims-based-identity asp.net-core asp.net-core-identity

我必须根据“钥匙”和“门”的存在来迁移具有自定义授权的应用程序。基本上,许多钥匙被分配给用户,并且该用户不能根据他获得的钥匙做事/打开门。

显而易见的解决方案是转向 ASP.Net Core Identity 的基于声明的授权。每个键都成为一个声明。重点是我想直接检查是否存在开门索赔,而不是保单。这是为了避免编写(很多,因为有数百个键)代码。

所以,从:

Startup.cs:
   options.AddPolicy("Key1", policy => policy.RequireClaim("Key1"));
Controller:
   [Authorize(Policy = "Key1")]
Run Code Online (Sandbox Code Playgroud)

对于类似的事情:

Controller:
   [Authorize(Claim = "Key1")]
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最佳方法是什么?

Nan*_* Yu 5

推荐的方式是使用基于策略的授权,您可以点击这里进行类似的讨论。

您可以使用自定义授权过滤器来满足您的要求,如果您只是检查用户声明中是否存在声明类型,您可以尝试以下代码示例:

ClaimRequirementFilter.cs:

public class ClaimRequirementFilter : IAuthorizationFilter
{
    readonly Claim _claim;

    public ClaimRequirementFilter(Claim claim)
    {
        _claim = claim;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var hasClaim = context.HttpContext.User.Claims.Any(c => c.Type == _claim.Type);
        if (!hasClaim)
        {
            context.Result = new ForbidResult();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ClaimRequirementAttribute.cs:

public class ClaimRequirementAttribute : TypeFilterAttribute
{
    public ClaimRequirementAttribute(string claimType ) : base(typeof(ClaimRequirementFilter))
    {
        Arguments = new object[] { new Claim(claimType , "") };
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用如下:

[ClaimRequirement("key")]
Run Code Online (Sandbox Code Playgroud)

如果您还需要限制索赔价值,您可以按照上面链接中的代码示例进行操作。