在 ASP.Net 身份中使用声明而不是策略进行授权
Authorize with Claims instead of Policies in ASP.Net Identity
我必须根据 "keys" 和 "doors" 的存在来迁移具有自定义授权的应用程序。基本上,许多钥匙被分配给一个用户,并且该用户不能根据他得到的钥匙做事/开门。
显而易见的解决方案是转向 ASP.Net 核心身份的基于声明的授权。每个密钥都成为一个声明。关键是我想直接检查是否存在开门索赔,而不是保单。这是为了避免编写(很多,因为有数百个键)代码。
所以,来自:
Startup.cs:
options.AddPolicy("Key1", policy => policy.RequireClaim("Key1"));
Controller:
[Authorize(Policy = "Key1")]
类似于:
Controller:
[Authorize(Claim = "Key1")]
实现此目标的最佳方法是什么?
推荐的方式是使用Policy based authorization,类似的讨论可以点击。
您可以使用自定义授权过滤器来满足您的要求,如果您只是检查用户声明中是否存在声明类型,您可以尝试以下代码示例:
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")]
如果您还需要限制 claim 的价值,您可以按照 中的代码示例进行操作。
我必须根据 "keys" 和 "doors" 的存在来迁移具有自定义授权的应用程序。基本上,许多钥匙被分配给一个用户,并且该用户不能根据他得到的钥匙做事/开门。
显而易见的解决方案是转向 ASP.Net 核心身份的基于声明的授权。每个密钥都成为一个声明。关键是我想直接检查是否存在开门索赔,而不是保单。这是为了避免编写(很多,因为有数百个键)代码。
所以,来自:
Startup.cs:
options.AddPolicy("Key1", policy => policy.RequireClaim("Key1"));
Controller:
[Authorize(Policy = "Key1")]
类似于:
Controller:
[Authorize(Claim = "Key1")]
实现此目标的最佳方法是什么?
推荐的方式是使用Policy based authorization,类似的讨论可以点击
您可以使用自定义授权过滤器来满足您的要求,如果您只是检查用户声明中是否存在声明类型,您可以尝试以下代码示例:
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")]
如果您还需要限制 claim 的价值,您可以按照