ClaimRequirementFilter - TypeFilterAttribute处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ClaimRequirementFilter - TypeFilterAttribute处理相关的知识,希望对你有一定的参考价值。
我已经实现了ClaimRequirementFilter,但注入/参数处理不起作用。 AuthorizationFilter的构造函数被调用两次。 MyClaim对象(参数)Name属性在第一次调用期间为null,在第二次调用时为空。 OnAuthorization仅使用null值调用一次。
MyClaimAttribute.cs
public class MyClaimAttribute : TypeFilterAttribute
{
public MyClaimAttribute(string claimName) : base(typeof(AuthorizationFilter))
{
MyClaim claim = new MyClaim
{
Name = claimName
};
Arguments = new object[] { claim };
}
}
AuthorizationFilter.cs
public AuthorizationFilter(MyClaim claim)
{
_claim = claim;
}
Startup.cs
services.AddTransient<MyClaim>();
services.AddMvc(options => options.Filters.Add(typeof(AuthorizationFilter)));
控制器方法装饰有:[MyClaim("CanDoSomething")]
更新1:
删除'services.AddMvc'行修复了问题,但我想为每个操作执行它。如果其中一个方法未装饰,则不应授权用户。
答案
由于claimName
为options.Filters.Add(typeof(AuthorizationFilter))
为零的原因,你注册MyClaim
而不传递string claimName
的任何值。
在注册string claimName
时尝试传递MyClaim
,如下所示。
services.AddTransient((serviceProvider)=> new Claim { Type = "T1", Value = "V1" });
services.AddMvc(c =>
{
c.Filters.Add(typeof(RequestLoggerActionFilter));
c.Filters.Add(typeof(ClaimRequirementFilter));
//c.Filters.Add(new ClaimRequirementFilter(new Claim { Type = "T1", Value = "V1" }));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
注意,Claim
对应于MyClaim
以上是关于ClaimRequirementFilter - TypeFilterAttribute处理的主要内容,如果未能解决你的问题,请参考以下文章