这是一个asp.net核心项目。 这是我的代码。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(...);
services.AddHttpContextAccessor();
services.TryAddSingleton<IUserInfo,UserInfo>();
第一个代码:
public class UserInfo : IUserInfo
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserInfo(IHttpContextAccessor iHttpContextAccessor)
{
_httpContextAccessor = iHttpContextAccessor;
}
public UserData GetUserData()
{
if (_httpContextAccessor.HttpContext.User.Identity.IsAuthenticated)
{
// do something
}
}
}
第二个代码:
public class UserInfo : IUserInfo
{
private readonly HttpContext _httpContext;
public UserInfo(IHttpContextAccessor iHttpContextAccessor)
{
_httpContext= iHttpContextAccessor.HttpContext;
}
public UserData GetUserData()
{
if (_httpContext.User.Identity.IsAuthenticated)
{
// do something
}
}
}
当我在Action
中使用第一个代码时,就可以了。 HttpContext.Request.Headers["Authorization"]
有我的令牌,IsAuthenticated
是真实的。
但是当我使用第二个代码时,它无法工作。 HttpContext
不正确。 HttpContext.Request.Headers["Authorization"]
为空,IsAuthenticated
为假。
我想知道为什么,谢谢。
如果您听不懂我的话,对此我感到抱歉,我的英语不好。。。
答案 0 :(得分:5)
IUserInfo,UserInfo
已注册为单例,因此只会被初始化一次。(请记住,这很重要)
在第一个示例中,每次调用GetUserData()
时_httpContextAccessor.HttpContext
都会返回当前请求的HttpContext
。
在第二个示例中,HttpContext
仅在单例类的构造函数中设置一次。这意味着每次调用GetUserData()
时,您将获得与第一次初始化时设置的上下文相同的上下文。这将意味着正在使用的上下文将不是当前请求的上下文,因为在初始化类时该请求尚不可用。
第一个示例是建议的访问当前HttpContext
的方法。