首页 > 解决方案 > 在自定义过滤器 .net Core 中使用依赖注入始终为空

问题描述

当我在 TokenAuthorizeFilter 中使用 DI 时,_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;
    }
}
...

用户解析服务.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 中的一个方法,所以我将它定义为静态的。现在我改变了写它的方式,我从微软的网站上找到了答案。非常感谢。

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

标签: c#asp.net-coredependency-injection

解决方案


您的帖子中有多个问题。

  • 你注册IUserResolverServiceservices.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;
      }
    }
    
  • 注册TokenAuthorizeFilterAddScoped

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

推荐阅读