--dotnet 7--我试图从头部中带有HttpContextAcessor的令牌中获取我的用户ID,我在Program.cs中注册了我的存储库和HttpContextAcessor
builder.Services.AddScoped<IWardrobeService, WardobreService>();
builder.Services.AddScoped<IGuildService, GuildService>();
builder.Services.AddHttpContextAccessor();
在WardrobeService里面,我可以使用accessor,它会返回id。
WardrobeService.cs:
private readonly DataContext _context;
private readonly IMapper _mapper;
private readonly IEffectService _fxService;
private readonly IHttpContextAccessor _httpContext;
private readonly IDMService _dmService;
public WardobreService(DataContext context, IMapper mapper, IEffectService fxService, IHttpContextAccessor httpContext, IDMService dmService)
{
_context = context;
_mapper = mapper;
_fxService = fxService;
_httpContext = httpContext;
_dmService = dmService;
}
// Needed Methods
private int GetCurrentUserId() => int.Parse(
_httpContext.HttpContext!.User.FindFirstValue(ClaimTypes.NameIdentifier)!
);
但如果我在GuildService中尝试此操作,访问器总是返回null。
GuildService.cs:
private readonly IMapper _mapper;
private readonly DataContext _context;
private readonly IHttpContextAccessor _httpContext;
private readonly IWardrobeService _wardrobe;
public GuildService(IMapper mapper, DataContext context, IHttpContextAccessor httpContext, IWardrobeService wardrobe)
{
_context = context;
_mapper = mapper;
_httpContext = httpContext;
_wardrobe = wardrobe;
}
// Needed Methods
private int GetCurrentUserId() => int.Parse(
_httpContext.HttpContext!.User.FindFirstValue(ClaimTypes.NameIdentifier)!
);
private async Task<Character> GetCurrentCharacter()
{
var c = await _context.Characters.FirstOrDefaultAsync(c => c.UserId == GetCurrentUserId());
return c!;
}
在这里,当我尝试使用GetCurrentCharacter()时,我得到一个错误,因为GetCurrentUserId()返回null。据我所知,我在两个仓库中做了同样的事情,我不明白为什么_httpContext.HttpContext总是返回null。
我尝试重写GuildService,没有成功。我尝试在GuildService内部调用**_wadrobeService**;如果我这样做,则问题发生在WardrobeService内部
更新:
通过在调用GuildService的控制器上添加[Authorize]解决了这个问题。这是两个仓库之间的区别,一个是在使用[Authorize]的控制器上调用的,另一个不是。
1条答案
按热度按时间vpfxa7rd1#
你有很多的#零宽恕在那里进行。打破它和检查。
在所有无法检索用户会话状态的情况下,都应该转储整个会话,强制用户重新进行身份验证。将其分解以查看实际设置(或未设置)的内容应该有助于缩小问题范围。
需要检查的地方是查看调用堆栈,以确定在整个请求中何时何地调用这个特定的存储库。如果它在不在Http请求范围内的情况下被调用,那么上下文访问器可能无法解析当前会话。这个GuildService在何处被注入/解析,以及它与其他看起来正常工作的服务有何不同?