ClaimRequirementFilter - обработка TypeFilterAttribute - PullRequest
0 голосов
/ 14 сентября 2018

Я реализовал ClaimRequirementFilter , но обработка впрыска / параметров не работает. Конструктор AuthorizationFilter вызывается дважды. Свойство Name объекта (параметра) MyClaim во время первого вызова равно нулю, а во втором оно заполняется. 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' устранило проблему, но я хотел бы выполнить ее для каждого действия. Если один из методов не оформлен, пользователь не должен быть авторизован.

1 Ответ

0 голосов
/ 17 сентября 2018

По причине того, что 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...