Получение токена доступа с помощью JWT, используемого для аутентификации AzureBearerAuthentication

У меня есть приложение WebApi, которое использует проверку подлинности на основе носителя Windows Azure Active Directory для проверки подлинности пользователей. После аутентификации пользователя я хочу запросить Graph Api Azure, чтобы получить больше информации о пользователе.

У меня есть решение, которое работает, но кажется очень хакерским. Я читаю заголовок авторизации и удаляю часть носителя, а затем использую AquireToken для получения нового токена:

var authHeader = HttpContext.Current.Request.Headers["Authorization"];
var tokenMatch = Regex.Match(authHeader, @"(?<=^\s*bearer\s+).+$", RegexOptions.IgnoreCase);

var result = authInfo.AuthContext.AcquireToken(resourceId, authInfo.Credential, 
    new UserAssertion(tokenMatch.Value));

return result.AccessToken;

Должен быть лучший способ, но я пробовал AcquireToken много разных перегрузок, и это был единственный способ заставить его работать. Я попробовал AcquireTokenSilent, который работает в моем клиентском приложении, потому что в TokenCache есть токен, но когда я пытаюсь в WebApi, кажется, что нигде не реализован TokenCache.

1 ответ

Решение

Это действительно несколько странно:-) см. https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet чтобы узнать, как можно получить входящий токен через ClaimsPrincipal. Сводится к прохождению TokenValidationParameters = new TokenValidationParameters{ SaveSigninToken = true } в опциях и извлечения из вашего контроллера или фильтра кода через

var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext; 
Другие вопросы по тегам