c# - 在自定义过滤器 .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 中的一个方法,所以我将它定义为静态的。现在我改变了写它的方式,我从微软的网站上找到了答案。非常感谢。
解决方案
您的帖子中有多个问题。
- 你注册
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>();
推荐阅读
- javascript - 如何设置我可以在库存中拥有的物品数量限制?
- git - Azure Devops:结帐步骤缓慢:到许多对象?
- javascript - 在这种情况下不知道如何更改为小写
- android - PlayerPrefs 不适用于 android 设备,但适用于统一编辑器
- python - 是否可以使用 Pydantic BaseModel orm_mode 从 gui 类获取数据
- java - 具有布尔属性和 SAP HANA DB 的 Hibernate HQL 查询
- c# - 检查列表中游戏对象的活动状态
- kubernetes - 需要在同一部署的 pod 上进行部署后任务
- excel - 收到运行时错误 13 将使用 instring 函数
- azure - 如何从 azure devops 中的另一个构建管道触发构建