Asp.net core GetUserIdAsync(用户)返回随机ID
我有asp net core 5 web api和EF core,当我第二次或多次调用Asp.net core GetUserIdAsync(用户)返回随机ID,asp.net-core,asp.net-core-webapi,Asp.net Core,Asp.net Core Webapi,我有asp net core 5 web api和EF core,当我第二次或多次调用userManager.GetUserIdAsync(user)时,每次都会得到一个不同的ID。请参见下面代码中的注释 我的控制器与此类似: 公共异步任务注册([FromBody]userForRegistration到userForRegistration) { IdentityResult result=await_repository.Account.Create(userForRegistration)
userManager.GetUserIdAsync(user)
时,每次都会得到一个不同的ID。请参见下面代码中的注释
我的控制器与此类似:
公共异步任务注册([FromBody]userForRegistration到userForRegistration)
{
IdentityResult result=await_repository.Account.Create(userForRegistration);
var host=$“{HttpContext.Request.Scheme}://{HttpContext.Request.host}”;
wait_repository.Account.GenerateEmailConfirmation(主机、用户注册);
返回状态码(201);
}
还有一个类似于此的存储库:
公共异步任务创建(userForRegistration到userForRegistration)
{
var user=new user{UserName=userForRegistration.Email,Email=userForRegistration.Email};
var user2=new User{UserName=userForRegistration.Email,Email=userForRegistration.Email};//用于测试
var result=await\u userManager.CreateAsync(user,userForRegistration.Password);
var userId=await _userManager.GetUserIdAsync(user);//此ID与数据库中的ID相同,因此工作正常
var userId2=await _userManager.GetUserIdAsync(user2);//此ID现在看起来是随机的,不在数据库中,甚至使用完全相同的用户数据。
wait_userManager.AddToRoleAsync(用户,“访问者”);
返回结果;
}
公共异步任务GenerateEmailConfirmation(字符串hostUrl,userForRegistration数据到userForRegistration)
{
var user=new user{UserName=userForRegistration.Email,Email=userForRegistration.Email};
var user2=新用户{UserName=“blabla”};
var userId=await _userManager.GetUserIdAsync(user);//再次使用“随机”ID
var userId2=await _userManager.GetUserIdAsync(user2);//在数据库中不存在,但我得到了一个随机ID
.....
}
有什么想法吗?谢谢 在将用户保存到数据库之前,您似乎试图搜索该用户。 您需要先将用户保存到数据库,例如:
IdentityResult res = await _userManager.CreateAsync(userForRegistration, password);
var user = await _userManager.FindByNameAsync(userForRegistration.UserName);
然后你会发现它是这样的:
IdentityResult res = await _userManager.CreateAsync(userForRegistration, password);
var user = await _userManager.FindByNameAsync(userForRegistration.UserName);
请注意,
Id
属性将被初始化以形成新的GUID字符串值。有关详细信息,您可以查看,如下所示
/// <summary>
/// Initializes a new instance of <see cref="IdentityUser"/>.
/// </summary>
/// <remarks>
/// The Id property is initialized to form a new GUID string value.
/// </remarks>
public IdentityUser()
{
Id = Guid.NewGuid().ToString();
SecurityStamp = Guid.NewGuid().ToString();
}
我正在使用CreateAncy,不幸的是,该方法需要是
GetUserIdAsync
(该方法最初在AspNetCore.Identity库中失败,我刚刚将其移出,以便在代码中重新生成)。您需要从数据库加载用户。您可以使用varuserId=(wait\u userManager.FindByNameAsync(userForRegistration.UserName)).Id
GetUserIdAsync
可能需要从数据库加载的用户。您是对的。我非常关注GetUserIdAsync,以至于我没有意识到问题在于每次创建对象时都要创建一个新Id!