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'行修复了问题,但我想为每个操作执行它。如果其中一个方法未装饰,则不应授权用户。

答案

由于claimNameoptions.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处理的主要内容,如果未能解决你的问题,请参考以下文章