【发布时间】:2020-07-08 18:33:27
【问题描述】:
我正在尝试使用 IAuthorizationFilter 实现来检查声明。使用以下代码,它工作得很好 -
public class ClaimsAttribute : TypeFilterAttribute
{
public ClaimsAttribute(string claimType, string claimValue) : base(typeof(ClaimsFilter))
{
this.Arguments = new object[] { new Claim(claimType, claimValue) };
}
}
public class ClaimsFilter : IAuthorizationFilter
{
private readonly Claim _claim;
public ClaimsFilter(Claim claim)
{
_claim = claim;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
var hasClaim = context.HttpContext.User.Claims.Any(p => p.Type == _claim.Type && p.Value == _claim.Value);
if (!hasClaim)
{
context.Result = new ForbidResult();
}
}
}
public class DocumentController : Controller
{
[Claims(AppClaimTypes.Permission, "CanReadDocument")]
[HttpGet]
public ActionResult GetDocument()
{
return View();
}
}
所以我想,我也可以检查多个 Claim 值 -
public class Claims2Attribute : TypeFilterAttribute
{
public Claims2Attribute(string claimType, params string[] claimValues) : base(typeof(Claims2Filter))
{
this.Arguments = new object[claimValues.Length];
for (int i = 0; i < claimValues.Length; i++)
{
this.Arguments[i] = new Claim(claimType, claimValues[i]);
}
}
}
public class Claims2Filter : IAuthorizationFilter
{
private readonly Claim[] _claims;
public Claims2Filter(Claim[] claims)
{
_claims = claims;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
bool hasClaim = false;
foreach (var item in _claims)
{
hasClaim = context.HttpContext.User.Claims.Any(p => p.Type == item.Type && p.Value == item.Value);
if (hasClaim)
break;
}
if (!hasClaim)
{
context.Result = new ForbidResult();
}
}
}
public class DocumentController : Controller
{
[Claims2(AppClaimTypes.Permission, "CanReadSecretDocument", "SecretAccess")]
[HttpGet]
public ActionResult GetSecretDocument()
{
return View();
}
}
但现在它会抛出错误 -
InvalidOperationException:适合类型的构造函数 找不到“AuthorizationFilterTest.Claims2Filter”。确保 类型是具体的,并且为所有参数注册了服务 一个公共构造函数。
我认为它与注册服务无关,否则第一个版本将无法正常工作。这似乎更琐碎/愚蠢,但我找不到它。
我做错了什么?
【问题讨论】:
标签: c# asp.net-core constructor iauthorizationfilter