Дополнительная заявка отсутствует в токене ADFS OnBehalfOf
Я использую MSAL с ADFS2019 и пытаюсь вызвать внутренний API от имени прошедшего проверку подлинности пользователя моего веб-приложения. У меня есть действительный токен доступа с некоторыми дополнительными утверждениями для идентификации пользователя:
{
"aud": "https://SRV",
"iss": "[***REMOVED***]",
"iat": 1687181262,
"nbf": 1687181262,
"exp": 1687184862,
"email": "user1@mydomain.com",
"winaccountname": "user1@mydomain.com",
"anchor": "sub",
"sub": "user1@mydomain.com",
"apptype": "Confidential",
"appid": "https://SRV",
"authmethod": "http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/windows",
"auth_time": "2023-06-19T12:11:56.653Z",
"ver": "1.0",
"scp": "email user_impersonation profile openid"
}
Я использую этот токен как UserAssertion, когда вызываю метод AcquireTokenOnBehalfOf. Вызов успешен, но в полученном токене нет абсолютно никаких претензий, которые могли бы помочь мне идентифицировать пользователя (только приложение), вызывающего API:
{
"aud": "api://API",
"iss": "[***REMOVED***]",
"iat": 1687181215,
"nbf": 1687181215,
"exp": 1687184815,
"apptype": "Confidential",
"appid": "https://SRV",
"auth_time": "2023-06-19T12:11:56.653Z",
"authmethod": "http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/windows",
"ver": "1.0",
"scp": "profile user_impersonation openid email"
}
Вот код, который я использую для генерации второго токена:
var token = await HttpContext.GetTokenAsync("access_token");
var resource = _configuration["ADFS:Resource"];
var client = ConfidentialClientApplicationBuilder.Create(_configuration["ADFS:ClientID"]).
WithAdfsAuthority(_configuration["ADFS:Instance"]).
WithClientSecret(_configuration["ADFS:ClientSecret"]).Build();
var userAssertion = new UserAssertion(token, "urn:ietf:params:oauth:grant-type:jwt-bearer");
var result = await client.AcquireTokenOnBehalfOf(new[] { $"{resource}/openid", $"{resource}/email" , $"{resource}/user_impersonation" }, userAssertion)
.WithClaims("sub, upn")
.ExecuteAsync();
var httpClient = _httpClientFactory.CreateClient("WebAPI");
httpClient.BaseAddress = new Uri(_configuration["ServiceUrl"]);
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", result.AccessToken);
Weather = await httpClient.GetFromJsonAsync<IEnumerable<WeatherServiceResponse>>("/WeatherForecast");
return;
Что мне не хватает? Вероятно, это глупая ошибка, но я новичок во всем этом, и у меня не так много хорошей документации о том, как решить проблему с ADFS(но много с AAD).
Спасибо.