Использование внедрения зависимостей в пользовательском фильтре .net Core всегда null - PullRequest
0 голосов
/ 05 октября 2018

Когда я использую DI в TokenAuthorizeFilter, _User всегда возвращает null. Не только _User, это всего лишь пример того, с чем я столкнулся.Я пробовал разные способы, но все еще не работает.

Сейчас я в замешательстве, пожалуйста, скажите мне, почему.Спасибо

public class BaseAuthorizeFilter : IAuthorizationFilter, IActionFilter
{
    public static ClaimsIdentity _User;
    public static IHttpContextAccessor _accessor;

    public BaseAuthorizeFilter(UserResolverService userService, IHttpContextAccessor accessor)
    {
        _User = userService.GetUser();
        _accessor = accessor;
    }
}
...

UserResolverService.cs

public class UserResolverService : IUserResolverService
{
    private readonly IHttpContextAccessor _context;

    public UserResolverService(IHttpContextAccessor context)
    {
        _context = context;
    }

    public ClaimsIdentity GetUser()
    {
        return _context.HttpContext.User.Identity as ClaimsIdentity;
        //await
    }
}

public interface IUserResolverService
{
    ClaimsIdentity GetUser();
}

TokenAuthorizeFilter.cs

public class TokenAuthorizeFilter : BaseAuthorizeFilter
{
    var identity = _User;
}

Извините, я не упомянул что-то в своем вопросе.Я вызываю метод в TokenAuthorizeFilter из другого класса, поэтому я определил его как статический.Теперь я изменил свой способ написания и нашел ответ на веб-сайте Microsoft.Большое спасибо.

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.1#ifilterfactory-implemented-on-your-attribute

1 Ответ

0 голосов
/ 08 октября 2018

В вашем сообщении несколько вопросов.

  • Вы регистрируете IUserResolverService с помощью services.AddSingleton<IUserResolverService, UserResolverService>();, но вводите UserResolverService userService,
  • Вы не должны определять ClaimsIdentity _User как статический, это должна быть изоляция запроса

попробуйте изменить, как показано ниже:

    public class BaseAuthorizeFilter : IAuthorizationFilter, IActionFilter
{
    public ClaimsIdentity _User;
    public IHttpContextAccessor _accessor;

    public BaseAuthorizeFilter(IUserResolverService userService, IHttpContextAccessor accessor)
    {
        _User = userService.GetUser();
        _accessor = accessor;
    }
  • Проверьте разницу между вашим TokenAuthorizeFilter и кодом ниже:

    public class TokenAuthorizeFilter : BaseAuthorizeFilter
    {
       public TokenAuthorizeFilter(IUserResolverService userService
           , IHttpContextAccessor accessor):base(userService, accessor)
      {
          var identity = _User;
      }
    }
    
  • Зарегистрируйтесь TokenAuthorizeFilter как AddScoped

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddSingleton<IUserResolverService, UserResolverService>();
        services.AddScoped<TokenAuthorizeFilter>();
    
...