Я изменяю свою аутентификацию с использованием сервера идентификации на использование встроенной аутентификации .net-core.Я пытаюсь получить токены доступа из внешнего логина.Но когда я иду, чтобы получить пользователя из диспетчера пользователей, он возвращает ноль.Я использую поток кода авторизации OAuth для входа в систему.У меня есть метод обратного вызова, который регистрирует и возвращает JWT (я упустил некоторый нерелевантный код для простоты)
[HttpGet("ExternalLoginCallback")]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
var info = await _signInManager.GetExternalLoginInfoAsync();
// Sign in the user with this external login provider if the user already has a login.
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
var user = await (result.Succeeded ?
_userManager.FindByLoginAsync(info.LoginProvider, info.ProviderKey)
: this.CreateIdentityUser(info));
var serviceProvider = HttpContext.RequestServices;
var context = serviceProvider.GetRequiredService<PublicAstootContext>();
await _signInManager.UpdateExternalAuthenticationTokensAsync(info);
_logger.LogInformation("User logged in with {Name} provider.", info.LoginProvider);
return await GenerateJwtResponse(_jwtFactory.GenerateClaimsIdentity(user.UserName, user.Id, userId),
_jwtFactory, _jwtOptions);
}
Я создаю свою личность следующим образом:
private async Task<IdentityUser> CreateIdentityUser(ExternalLoginInfo info)
{
string email = await this.GetEmailFromLoginInfo(info);
//var email = info.Principal.FindFirstValue(ClaimTypes.Email);
var user = new IdentityUser { UserName = email, Email = email };
var signinResult = await _userManager.CreateAsync(user);
if (false == signinResult.Succeeded)
{
throw new Exception("Failed to Create User");
}
var addLoginResult = await _userManager.AddLoginAsync(user, info);
if (addLoginResult.Succeeded)
{
await _signInManager.SignInAsync(user, isPersistent: false);
_logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
}
return user;
}
КогдаЯ иду, чтобы получить маркер доступа третьей стороны
var user = httpContext.User;
var userManager = sp.GetRequiredService<UserManager<IdentityUser>>();
var userFromManager = userManager.GetUserAsync(user).Result;
var accessToken = userManager.GetAuthenticationTokenAsync(
userFromManager, "Coinbase", "access_token").Result;
РЕДАКТИРОВАТЬ
Я не могу найти своего пользователя в UserManager.Как я могу получить свой сторонний токен доступа?
Похоже, мой HttpContext.User и мой UserManager не синхронизированы.
var user = httpContext.User;
var userManager = sp.GetRequiredService<UserManager<IdentityUser>>();
if(false == user.TryGetClaimByType<string>(AuthenticationRule.EMAIL_CLAIM_TYPE, out var email))
{
throw new UnauthorizedAccessException();
}
Как я могу синхронизировать HttpContext.Пользователь и Usermanger, поэтому я могу просто позвонить:
var userFromManager = userManager.GetUserAsync(user).Result;