Как создать токен авторизации с «upn» / «уникальным_имением» (emailId пользователя) в качестве части заявки для моих тестовых примеров интеграции API - PullRequest
1 голос
/ 07 апреля 2019

Я хочу запустить свои тестовые случаи 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("demoUser@tenant1.onmicrosoft.com");
        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"
}

1 Ответ

0 голосов
/ 07 апреля 2019

Это один из немногих случаев, когда я обнаружил, что поток 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.

...