Я создал веб-приложение .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;
}
}