Asp.Net Core Azure AD V1.0 JWT Аутентификация Недопустимая подпись
Я должен сделать приложение ASP.NET Core 2.0 Web API, которое использует ресурсы Microsoft Graph. Я пытался заставить приложение использовать аутентификацию JWT со следующими свойствами:
Audience: "CLIENT_ID";
Authority: "https://login.microsoftonline.com/TENANT_ID"
Идея в том, что у меня есть приложение SPA, которое использует ADAL для получения токена доступа, который должен использоваться для аутентификации в Web API. Полученный токен успешно проходит проверку подлинности в Microsoft Graph Requests, но не проходит проверку подлинности JWT. Ошибка неавторизованного ответа:
Неверная подпись
Вот десериализованный токен:
{
"typ": "JWT",
"nonce": "AQABAAAAAABHh4kmS_aKT5XrjzxRAtHzXF_CqRIDpjJHoJWBZWfqGU15M5j1xqsBga7obz1SUDjg3Ft56m4bTqls5nSs1T0ymPVzRTHZ7osxohQx9iRClSAA",
"alg": "RS256",
"x5t": "z44wMdHu8wKsumrbfaK98qxs5YI",
"kid": "z44wMdHu8wKsumrbfaK98qxs5YI"
}.{
"aud": "https://graph.microsoft.com",
"iss": "https://sts.windows.net/TENANT_ID/",
"iat": 1515769573,
"nbf": 1515769573,
"exp": 1515773473,
"acr": "1",
"aio": "Y2NgYHjhxRdU0DHj52u1ANkNv4qnVYoUbA2vYDu/dHHH1UcTUiwA",
"amr": [
"pwd"
],
"app_displayname": "APP_NAME",
"appid": "CLIENT_ID",
"appidacr": "0",
"e_exp": 262800,
"ipaddr": "80.72.72.11",
"name": "NAME",
"oid": "USER_ID",
"platf": "3",
"puid": "1003BFFDA650568E",
"scp": "Directory.ReadWrite.All EduAssignments.ReadWrite Mail.Send User.Read User.ReadBasic.All User.ReadWrite.All",
"sub": "60Oat50bmTi24tObKrBPrjIpotUdZkUl5h0x0I6dLi0",
"tid": "TENANT_ID",
"unique_name": "UNIQUE_NAME",
"upn": "UPN",
"uti": "9z7lfwGNmkmqEO7KpWcKAA",
"ver": "1.0"
}.[Signature]
Jwt.ms говорит, что это токен Azure AD V1.0. Так что должно быть в какой-то мере. Я попытался получить токен Azure AD V2.0 с MSAL, который успешно проходит аутентификацию в Web API, но не удается выполнить запросы графов. Что я делаю неправильно?
РЕДАКТИРОВАТЬ Я изменил свою конфигурацию, чтобы снова использовать токен v2.0, а затем попытался использовать руководство @juunas, чтобы получить токен доступа к графику, например так:
var userAssertion = new UserAssertion(token, assertionType, email);
var authContext = new AuthenticationContext("https://login.microsoftonline.com/common/v2.0");
var clientCredential = new ClientCredential("CLIENT_ID", "CLIENT_SECRET");
//Acquire access token
var result = await authContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential, userAssertion);
string graphToken = result.AccessToken;
но AcquireTokenAsyncMethod выдает следующую ошибку:
Эмитент токена не соответствует версии API: токен версии 2 может использоваться только с конечной точкой v2
Я нахожу это действительно странным, поскольку все теперь настроено для версии 2.0, и мой токен является действительным токеном Azure AD v2.0 с издателем: https://login.microsoftonline.com/TENANT_ID/v2.0
1 ответ
Вам нужен отдельный токен доступа для вашего API.
Маркер доступа из Azure AD всегда предназначен только для одного API/ ресурса.
Кроме того, если вам нужно вызвать MS Graph API из вашего API, вы можете обратиться к гранту от имени: https://joonasw.net/view/azure-ad-on-behalf-of-aspnet-core
Основная идея этого потока заключается в том, что когда ваш API получает вызов, содержащий токен доступа, который имеет пользовательский контекст, вы можете обменять этот токен + учетные данные вашего API на новый токен доступа для другого API, который все еще имеет тот же пользовательский контекст.