我使用身份进行了简单的登录。我使用signInManager.PasswordSignInAsync()
登录。
如果登录成功,我想使用userManager
获取当前登录的用户数据。
问题是我只能从GetUserAsync
获取一个ID,却不知道该怎么做。
var result = await mSignInManager.PasswordSignInAsync(username, password, true, false);
if (result.Succeeded)
{
//var loggedUser = mUserManager.GetUserName(HttpContext.User);
var userData = mUserManager.GetUserAsync(HttpContext.User);
var user = await mUserManager.FindByIdAsync(userData.Id.ToString());
return Redirect("/createpost");
}
答案 0 :(得分:0)
对我来说,您似乎正在登录用户并立即尝试访问用户信息。 httpContext没有机会更新,仍然可以反映没有用户登录的时间。尝试将用户信息检索逻辑移至“ createpost”,在下一次HTTP往返执行该操作。
public async Task<IActionResult> createpost()
{
var userData = await mUserManager.GetUserAsync(HttpContext.User);
Debug.WriteLine(userData.Id);
Debug.WriteLine(userData.UserName);
Debug.WriteLine(userData.Email);
return View();
}
答案 1 :(得分:0)
您遇到了两个问题。首先,GetUserAsync
依赖于HttpContext
中设置的主体(尚未发生),因此该方法将失败。在您以这种方式访问用户之前,必须有一个干预请求。
您可以做的就是使用FindByIdAsync
之类的东西直接将用户拉出来,而您已经尝试这样做。但是,您正在尝试根据尝试通过GetUserAsync
检索的用户实例的ID查找用户。由于失败,将没有用户,因此也没有在此查找中使用的ID,也将导致失败。这样做甚至没有意义,就好像您已经有用户要从中获取ID一样,通过该ID查找该用户也毫无意义。
因此,您需要做的是根据您实际拥有的信息来查找用户,该信息根据您的代码为username
。因此,请执行以下操作:
var user = await mUserManager.FindByNameAsync(username);
答案 2 :(得分:0)
原因是该用户可用于下一个请求,您不能在当前请求中找到该用户,更不用说用户名了。