Получение токенов доступа с внешнего логина - PullRequest
0 голосов
/ 27 февраля 2019

Я изменяю свою аутентификацию с использованием сервера идентификации на использование встроенной аутентификации .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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...