Получение токена доступа с помощью 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;