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



我必须根据"钥匙"one_answers"门"的存在来迁移具有自定义授权的应用程序。基本上,很多钥匙都分配给了一个用户,而这个用户(不能(根据他得到的钥匙做事/开门。

显而易见的解决方案是转向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")]

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

最新更新