Как вернуть токен из Azure AD B2C в ASP Core 2.0? - PullRequest
0 голосов
/ 04 мая 2018

Я создал веб-приложение .NET Core 2.0 MVC по умолчанию с аутентификацией учетной записи пользователя с помощью Azure B2C. Мне удалось успешно войти в систему с моей политикой B2C.

Я хочу получить токен доступа пользователя, который будет перенаправлен на другой API. Я следовал за этим постом , но access_token, возвращаемый на 2-м шаге, является нулевым событием, а id_token - нет.

Я попытался изменить опцию ResponseType для моего OpenIdConnection, добавив 'token', чтобы получить 'token id_token code' (как показано здесь ), и я получаю ошибку

Сообщение содержит ошибку: 'invalid_request', error_description: 'AADB2C90055: область действия' openid profile ', указанная в запросе укажите ресурс, например 'https://example.com/calendar.read'.

Я получаю ошибку только тогда, когда в ResponseType есть «токен».

Как мне исправить эту ошибку? Мне нужно установить ресурс или, возможно, изменить область? Собираюсь ли я правильно получить access_token?

Дополнительная информация: Я создал стандартное приложение .NET Core с аутентификацией учетной записи пользователя в Azure. Я изменял автоматически созданный AzureAdB2cAuthenticationBuilderExtension.cs.

Я изменил функцию настройки:

public void Configure(string name, OpenIdConnectOptions options)
{
    options.ClientId = _azureOptions.ClientId;
    options.Authority = $"{_azureOptions.Instance}/{_azureOptions.Domain}/{_azureOptions.SignUpSignInPolicyId}/v2.0";
    options.UseTokenLifetime = true;
    options.CallbackPath = _azureOptions.CallbackPath;

    // Added 'token' here so I can retrieve the access token
    options.ResponseType = "code id_token token";
    options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name" };

    options.Events = new OpenIdConnectEvents
    {
        OnRedirectToIdentityProvider = OnRedirectToIdentityProvider,
        OnRemoteFailure = OnRemoteFailure,

        //Added this so I can store the access_token in the cache
        OnAuthorizationCodeReceived = OnAuthorizationCodeReceived,

    };
}

Затем я добавил нижеприведенную функцию, чтобы я мог сохранить и затем извлечь токен доступа из TokenCache

public async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
{
    // Use MSAL to swap the code for an access token
    // Extract the code from the response notification
    var code = context.ProtocolMessage.Code;
    string signedInUserID = context.Principal.FindFirst(ClaimTypes.NameIdentifier).Value;

    TokenCache userTokenCache = new MSALSessionCache(signedInUserID, context.HttpContext).GetMsalCacheInstance();
    ConfidentialClientApplication cca = new ConfidentialClientApplication(_azureOptions.ClientId, _azureOptions.Authority, _azureOptions.RedirectUri, new Microsoft.Identity.Client.ClientCredential(_azureOptions.ClientSecret), userTokenCache, null);
    try
    {
        Microsoft.Identity.Client.AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, _azureOptions.ApiScopes.Split(' '));
        context.HandleCodeRedemption(result.AccessToken, result.IdToken);
    }
    catch (Exception ex)
    {
        //TODO: Handle
        throw;
    }
}

1 Ответ

0 голосов
/ 14 мая 2018

Что вы делаете, вы запрашиваете «токен» (= access_token), но не определяете область действия, из которой вы хотите «токен». Вам необходимо опубликовать область (и) API, а также предоставить разрешение для области (ей) в портале Azure B2C для вызывающего приложения.

Затем, войдя в вызывающее приложение (обычно приложение пользовательского интерфейса), вы можете запросить «токен» (access_token) во время входа в систему, определив интересующую вас область. Если вам правильно назначено разрешение для вызова Приложение пользовательского интерфейса к опубликованному приложению API через области действия. Соответствующие области видны в заявке «scp».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...