Asp.net core 在ASP.Net标识中使用声明而不是策略进行授权

Asp.net core 在ASP.Net标识中使用声明而不是策略进行授权,asp.net-core,claims-based-identity,asp.net-core-identity,Asp.net Core,Claims Based Identity,Asp.net Core Identity,我必须根据钥匙和门的存在,迁移一个具有自定义授权的应用程序。基本上,一个用户被分配了许多钥匙,而该用户不能根据他得到的钥匙做任何事情/开门 显而易见的解决方案是转向ASP.Net核心身份的基于声明的授权。每一把钥匙都成为一种要求。问题是,我想直接检查是否存在开门声明,而不是保险单。这是为了避免编写大量的密钥代码,因为有数百个密钥代码 因此,来自: Startup.cs: options.AddPolicy("Key1", policy => policy.RequireClaim("

我必须根据钥匙和门的存在,迁移一个具有自定义授权的应用程序。基本上,一个用户被分配了许多钥匙,而该用户不能根据他得到的钥匙做任何事情/开门

显而易见的解决方案是转向ASP.Net核心身份的基于声明的授权。每一把钥匙都成为一种要求。问题是,我想直接检查是否存在开门声明,而不是保险单。这是为了避免编写大量的密钥代码,因为有数百个密钥代码

因此,来自:

Startup.cs:
   options.AddPolicy("Key1", policy => policy.RequireClaim("Key1"));
Controller:
   [Authorize(Policy = "Key1")]
例如:

Controller:
   [Authorize(Claim = "Key1")]

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

推荐的方法是使用基于策略的授权,您可以单击进行类似的讨论

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

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();
        }
    }
}
ClaimRequirementAttribute.cs:

public class ClaimRequirementAttribute : TypeFilterAttribute
{
    public ClaimRequirementAttribute(string claimType ) : base(typeof(ClaimRequirementFilter))
    {
        Arguments = new object[] { new Claim(claimType , "") };
    }
}
并使用类似于:

[ClaimRequirement("key")]

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

建议使用基于策略的授权,您可以单击进行类似的讨论

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

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();
        }
    }
}
ClaimRequirementAttribute.cs:

public class ClaimRequirementAttribute : TypeFilterAttribute
{
    public ClaimRequirementAttribute(string claimType ) : base(typeof(ClaimRequirementFilter))
    {
        Arguments = new object[] { new Claim(claimType , "") };
    }
}
并使用类似于:

[ClaimRequirement("key")]

如果您还需要限制索赔的价值,您可以按照。

非常好的解决方案!这是一个非常好的解决方案!详细说明