Как сохранить и затем извлечь access_token внешнего провайдера входа - PullRequest
0 голосов
/ 29 января 2020

Я использую шаблон. Net Core Angular с индивидуальными учетными записями:

dotnet new angular -au individual

И добавляю внешнего провайдера для входа в систему Microsoft таким образом:

services.AddAuthentication()
        .AddMicrosoftAccount(config => {
            config.ClientId = "***REDACTED***";
            config.ClientSecret = "***REDACTED***";
            config.SaveTokens = true;
        })
        .AddIdentityServerJwt();

Затем я создаю страницу с атрибутом [Authorized] и пытаюсь получить Microsoft access_token, но она всегда отображается как null. Вот как создается страница:

Test.cs html

@page
@model TestModel

hi

    Access Token
    
@Model.AccessToken

Идентификационный токен

@Model.IdToken

Тест .cs html .cs

[Authorize]
public class TestModel : PageModel {
    private readonly UserManager<ApplicationUser> _userManager;
    public string AccessToken;
    public string IdToken;

    public TestModel(UserManager<ApplicationUser> userManager) {
        _userManager = userManager;
    }

    public async Task OnGetAsync() {
        if (!User.Identity.IsAuthenticated) {
            return;
        }
        var user = await _userManager.GetUserAsync(User);
        AccessToken = await _userManager.GetAuthenticationTokenAsync(user, "Microsoft", "access_token");
        IdToken = await _userManager.GetAuthenticationTokenAsync(user, "Microsoft", "id_token");
    }
}

Как уже упоминалось, я всегда получаю null значения для AccessToken и IdToken - что я делаю не так?

PS I также пытался await HttpContext.GetTokenAsync("Microsoft", "access_token") - он также возвращает null.

1 Ответ

0 голосов
/ 30 января 2020

Отвечая на мой собственный вопрос после нескольких дней исследований, которые привели меня к клонированию репо на https://github.com/dotnet/aspnetcore и на https://github.com/identityserver/identityserver4 и отслеживании цели с помощью кода ...

Решение состоит в том, чтобы добавить вызов к SigninManager.UpdateExternalAuthenticationTokensAsync в обработчик обратного вызова Account/ExternalLogin (метод OnGetCallbackAsync) после проверки успешности внешнего входа в систему, т. Е. После вызова к _signInManager.ExternalLoginSignInAsync, таким образом:

// 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);
if (result.Succeeded) {
    await _signInManager.UpdateExternalAuthenticationTokensAsync(info); // <-- This
    _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider);
    return LocalRedirect(returnUrl);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...