背景
我正在开发.Net Core API项目,以推动社区驱动的歌词网站。因此,用户可以提交艺术家和歌词。每位艺术家都有很多歌词(经典的一对多)。
用于身份验证&授权,我正在使用JWT令牌。
CODE
在我的歌词控制器上,我有一个"test": "jest"
方法来创建歌词。这是代码:
[HttpPost]
在我[Authorize]
[HttpPost("{artistSlug}/lyrics")]
public async Task<IActionResult> CreateLyric(string artistSlug, [FromBody] LyricCreateDto newLyricCreateDto)
{
if (newLyricCreateDto == null) return BadRequest();
if (!ModelState.IsValid) return BadRequest(ModelState);
var user = _userManager.GetUserAsync(HttpContext.User);
var lyricReadDto = await _lyricsService.AddNewLyric(user.Id.ToString(), artistSlug, newLyricCreateDto);
if (lyricReadDto == null) return NotFound();
return CreatedAtRoute("GetLyric", new {artistSlug, lyricSlug = lyricReadDto.Slug}, lyricReadDto);
}
我有以下内容:
Startup.cs
问题
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, DatabaseDataSeeder databaseDataSeeder)
{
loggerFactory.AddConsole();
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = _config["Tokens:Issuer"],
ValidAudience = _config["Tokens:Audience"],
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"])),
ValidateLifetime = true
}
});
app.UseMvc();
databaseDataSeeder.Seed().Wait();
}
返回的用户的Id(类型为var user = _userManager.GetUserAsync(HttpContext.User);
)与int
表中的用户ID不匹配。另外,表dbo.AspNetUsers
中的Id列的类型为dbo.AspNetUsers
。
我不确定这是怎么回事!这是一个截图:
这是SQL Management Studio中针对Guid
的查询:
为什么会这样?
答案 0 :(得分:5)
问题在于您正在查看异步方法的结果,换句话说是Task<>
,其Id
属性与您的用户无关。您需要await
方法调用:
var user = await _userManager.GetUserAsync(HttpContext.User);
答案 1 :(得分:5)
您不是在等待任务的结果,因此您实际上并未调试/查看User
而是Task
对象。添加await
关键字。
var user = await _userManager.GetUserAsync(HttpContext.User);