UserManager返回的ID与数据库中的Id不同

时间:2017-08-14 12:56:37

标签: c# asp.net-core entity-framework-core

背景

我正在开发.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

我不确定这是怎么回事!这是一个截图:

user in code

这是SQL Management Studio中针对Guid的查询:

user in database

为什么会这样?

2 个答案:

答案 0 :(得分:5)

问题在于您正在查看异步方法的结果,换句话说是Task<>,其Id属性与您的用户无关。您需要await方法调用:

var user = await _userManager.GetUserAsync(HttpContext.User);

答案 1 :(得分:5)

您不是在等待任务的结果,因此您实际上并未调试/查看User而是Task对象。添加await关键字。

var user = await _userManager.GetUserAsync(HttpContext.User);