0

When I am using the DI in TokenAuthorizeFilter, the _User always return null.Not only the _User, this is only an example of what I am encountered. I've tried different ways but still doesn't work.

I'm confused now, please tell me why. Thank you

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;
}

Sorry, I didn’t mentioned something in my question. I am calling a method in TokenAuthorizeFilter from another class so I defined it as static. Now I change my way writing it, and I found the answer from Microsoft’s website. Thanks a lot.

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

9
  • Where are you registering your filter? Is it just _User that's null, or also _accessor? Commented Oct 5, 2018 at 7:44
  • Also the _accessor in Startup.cs: services.AddSingleton<TokenAuthorizeFilter>(); Do you mean this? Commented Oct 5, 2018 at 7:45
  • 1
    Why are you registering it as a singleton? That's very likely to be your problem. Commented Oct 5, 2018 at 7:48
  • 1
    I think that's OK, but BaseAuthorizeFilter should not be a singleton. Commented Oct 5, 2018 at 7:52
  • 1
    You showed me this: services.AddSingleton<TokenAuthorizeFilter>();? Commented Oct 5, 2018 at 7:59

1 Answer 1

1

There are multiple issues in your post.

  • You register IUserResolverService by services.AddSingleton<IUserResolverService, UserResolverService>();, but you inject UserResolverService userService,
  • You should not define ClaimsIdentity _User as static, it should be request isolation

try to change like below:

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

    public BaseAuthorizeFilter(IUserResolverService userService, IHttpContextAccessor accessor)
    {
        _User = userService.GetUser();
        _accessor = accessor;
    }
  • Check the difference between your TokenAuthorizeFilter and below code:

    public class TokenAuthorizeFilter : BaseAuthorizeFilter
    {
       public TokenAuthorizeFilter(IUserResolverService userService
           , IHttpContextAccessor accessor):base(userService, accessor)
      {
          var identity = _User;
      }
    }
    
  • Register TokenAuthorizeFilter as AddScoped

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddSingleton<IUserResolverService, UserResolverService>();
        services.AddScoped<TokenAuthorizeFilter>();
    
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.