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