UserManager.GetUserAsync
internally uses UserManager.GetUserId
to retrieve the user id of the user which is then used to query the object from the user store (i.e. your database).
GetUserId
basically looks like this:
public string GetUserId(ClaimsPrincipal principal)
{
return principal.FindFirstValue(Options.ClaimsIdentity.UserIdClaimType);
}
So this returns the claim value of Options.ClaimsIdentity.UserIdClaimType
. Options
is the IdentityOptions
object that you configure Identity with. By default the value of UserIdClaimType
is ClaimTypes.NameIdentifier
, i.e. "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"
.
So when you try to use UserManager.GetUserAsync(HttpContext.User)
, where that user principal has a UserID
claim, the user manager is simply looking for a different claim.
You can fix this by either switchting to the ClaimTypes.NameIdentifier
:
new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
})
Or you configure Identity properly so it will use your UserID
claim type:
// in Startup.ConfigureServices
services.AddIdentity(options => {
options.ClaimsIdentity.UserIdClaimType = "UserID";
});