【问题标题】:ClaimRequirementFilter - TypeFilterAttribute handlingClaimRequirementFilter - TypeFilterAttribute 处理
【发布时间】:2018-09-14 12:05:53
【问题描述】:

我已经实现了ClaimRequirementFilter,但是注入/参数处理不起作用。 AuthorizationFilter 的构造函数被调用了两次。 MyClaim 对象(参数)Name 属性在第一次调用期间为空,在第二次调用中被填充。 OnAuthorization 只调用一次,使用空值。

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”行解决了这个问题,但我想为每个操作执行它。如果其中一个方法没有被修饰,用户不应该被授权。

【问题讨论】:

    标签: c# .net asp.net-core authorization


    【解决方案1】:

    claimNameoptions.Filters.Add(typeof(AuthorizationFilter)) 为空的原因是,您注册 MyClaim 而不为 string claimName 传递任何值。

    在注册MyClaim 时尝试传递string claimName,如下所示。

                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

    【讨论】:

    • 我想使用 [MyClaim("CanDoSomething")] 的属性值,而不是硬编码 AddTransient 中的值。 ClaimRequirementFilter 应该使用/检查属性的值。
    • @Odrai 如果有多个[MyClaim("CanDoSomething")],如何知道使用哪个值?无论如何,c.Filters.Add 用于所有操作,您需要对值进行硬编码,就像您通过 `[MyClaim("CanDoSomething")]` 一样,这也是硬编码。
    • 每个操作只有一个 MyClaim 属性。例如。动作1需要'CanDoSomething'权限和动作2'CanViewSomething',我应该如何实现services.AddTransient和c.Filters? ClaimRequirementFilter 如何知道某个操作需要检查哪个硬编码声明?
    • @Odrai 看来你误用了ClaimRequirementFilter ClaimRequirementFilter 将是一个具有特定 MyClaim 的实例,并将应用于所有 MVC 操作。
    • @ToaZhou asp.net core 2 是否提供另一种解决方案?我想用一个权限来装饰动作,并且某个过滤器需要检查所有执行的动作。如果动作没有修饰,则返回未授权,否则检查属性值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多