Как создать токен авторизации с «upn»/«unique_name» (идентификатор электронной почты пользователя) как часть утверждения для моих тестовых примеров интеграции API

Я хочу запустить свои тестовые примеры API, в рамках которых я создаю токен авторизации. Раньше конечные точки приложения требовали, чтобы UserEmailId передавался в виде строки запроса, но теперь он был изменен для чтения UserEmailId из токена авторизации. Я хочу изменить свой метод GenerateAuthToken, чтобы включить EmailId как часть сгенерированного токена аутентификации.

Я ссылался на документацию в,

https://docs.microsoft.com/en-us/azure/architecture/multitenant-identity/claims

Я попытался передать UserEmailId с помощью UserAssertion, как показано ниже.

string authorityUrl = string.Format("https://login.microsoftonline.com/{0}", authority);
        AuthenticationContext authContext = new AuthenticationContext(authorityUrl, false);
        ClientCredential clientCredential = new ClientCredential(this.utils.GetClientId(), this.utils.GetClientSecret());
        UserAssertion userAssertion = new UserAssertion("[email protected]");
        AuthenticationResult authResult = authContext.AcquireTokenAsync(this.resource, clientCredential, userAssertion).Result;

но я получаю следующее исключение, AdalServiceException: AADSTS50027: токен JWT недействителен или имеет неверный формат.

Ожидается: я хочу, чтобы идентификатор UserEmail был частью претензии, в настоящее время это не так.

{
  "aud": "1bbc71b1-56b3-404c-8961-76ed5f603fab",
  "iss": "https://login.microsoftonline.com/e46fc01a-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0",
  "iat": 1549957732,
  "nbf": 1549957732,
  "exp": 1549961632,
  "aio": "42JgYGiUKZN6pn6WdbPPN9bLIW8ZAA= = ",
  "azp": "1bbc71b1-56b3-404c-8961-76ed5f603fab",
  "azpacr": "1",
  "tid": "e46fc01a-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "uti": "rbpCCAb6TEuNRRaen_0DAA",
  "ver": "2.0"
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
477
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это один из очень немногих случаев, когда я обнаружил, что поток ROPC можно использовать. ADAL не предлагает для этого перегрузку (в основном, чтобы люди не злоупотребляли этим потоком, я думаю), поэтому вам придется делать вызов вручную. Вот пример:

string tokenUrl = _authority + "oauth2/token";
var req = new HttpRequestMessage(HttpMethod.Post, tokenUrl)
{
    Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        ["grant_type"] = "password",
        ["client_id"] = "your-clientid",
        ["client_secret"] = "your-clientsecret",
        ["resource"] = "resource-uri-or-client-id-of-api",
        ["username"] = "your-username",
        ["password"] = "your-password"
    })
};

HttpResponseMessage res = await _client.SendAsync(req);

string json = await res.Content.ReadAsStringAsync();
AadTokenResponse tokenResponse = JsonConvert.DeserializeObject<AadTokenResponse>(json);

Класс ответа здесь довольно прост:

public class AadTokenResponse
{
    [JsonProperty("access_token")]
    public string AccessToken { get; set; }
}

Обратите внимание, что это будет работать только в том случае, если у пользователя нет MFA, не требуется аутентификация с помощью ADFS и т. д. Этот поток не следует использовать для рабочего клиента, а только для тестового пользователя в тестовом клиенте. По сути, вы получаете токен доступа для вызова API от имени пользователя без отображения экрана входа в систему. Это не должно использоваться для пропуска экрана входа в приложения. Тем не менее, я нашел его очень полезным для такого рода тестирования API.

Другие вопросы по теме