背景
我正在致力于一个.Net核心API项目,以推动一个社区驱动的歌词网站。这样用户就可以提交艺术家和歌词。每个艺术家都有许多歌词(经典一对多)。
对于身份验证和授权,我使用的是JWT令牌。
码
在我的歌词控制器上,我有一个[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();
}问题
var user = _userManager.GetUserAsync(HttpContext.User);返回的用户的Id (类型为int)与dbo.AspNetUsers表中的用户Id不匹配。加上表dbo.AspNetUsers中的Id列为Guid类型。
我不知道这怎么可能!这是一张截图:

下面是对Studio中的dbo.AspNetUsers的查询:

为什么会发生这种情况?
发布于 2017-08-14 13:00:12
问题是,您正在查看异步方法的结果,换句话说,是一个Task<>,它具有一个与用户没有任何关系的Id属性。您需要await方法调用:
var user = await _userManager.GetUserAsync(HttpContext.User);发布于 2017-08-14 13:00:21
您没有等待任务的结果,所以您实际上不是在调试/查看User,而是Task对象。添加await关键字。
var user = await _userManager.GetUserAsync(HttpContext.User);https://stackoverflow.com/questions/45675045
复制相似问题