Как получить / сгенерировать токен доступа из конечных точек Azure OAuth 2.0 token (v2)? - PullRequest
0 голосов
/ 17 мая 2019

Я хочу получить токен доступа по указанному URL:

https://login.microsoftonline.com/{AzureTenantId}/oauth2/v2.0/token

Я передаю следующие параметры, как указано в документации Microsoft: client_id, scope, client_secret, grant_type.

Когда я нажимаю на этот URL, я получаю ответ «400 Bad Request».

Когда я пытаюсь сделать то же самое с почтальоном, он успешно завершает работу и предоставляет мне токен доступа:

success postman request

Но не из моего кода:

public async Task<string> GetAuthorizationToken(string clientId, string ServicePrincipalPassword, string AzureTenantId) {
            var result = "";
            var requestURL = "https://login.microsoftonline.com/{AzureTenantId}/oauth2/v2.0/token";
            var _httpClient = new HttpClient();

            var model = new {
                client_id = clientId,
                scope = "{clentID}/.default",
                client_secret = ServicePrincipalPassword,
                grant_type = "client_credentials"
            };

            HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(model), System.Text.Encoding.UTF8, "application/x-www-form-urlencoded");

            var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(requestURL)) {
                Content = httpContent
            };

            using (var response = await _httpClient.SendAsync(httpRequestMessage)) {
                if (response.IsSuccessStatusCode) {
                    var responseStream = await response.Content.ReadAsStringAsync();
                    return result;
                } else {
                    return result;
                }
            }

Ответы [ 3 ]

3 голосов
/ 17 мая 2019

Ваш http-формат неверный, попробуйте:

var _httpClient = new HttpClient();

var content = new FormUrlEncodedContent(new Dictionary<string, string> {
              { "client_id", "ClientID" },
              { "client_secret", "YourSecret" },
              { "grant_type", "client_credentials" },
              { "scope", "https://graph.microsoft.com/.default" },
            });

var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(requestURL))
{
    Content = content
};

using (var response = await _httpClient.SendAsync(httpRequestMessage))
{
    if (response.IsSuccessStatusCode)
    {
        var responseStream = await response.Content.ReadAsStringAsync();
        return result;
    }
    else
    {
        return result;
    }
}
1 голос
/ 17 мая 2019

Так же, как дополнение к ответу Nan Yu * ​​1002 *, вы можете подумать об использовании библиотеки для этого, вместо того, чтобы пытаться реализовать это самостоятельно.

Например, с помощью библиотеки аутентификации Microsoft (MSAL) для .NET вы получите токен доступа, подобный следующему:

// Setup MSAL
var client = ConfidentialClientApplicationBuilder
    .Create("{client-id}")
    .WithAuthority("https://login.microsoftonline.com/{tenant-id}/v2.0")
    .WithClientSecret(/* retrieve from secure storage, do *NOT* put the secret in your code! */)
    .Build();

// Retrieve an access token
var scopes = new string[] { "https://graph.microsoft.com/.default" };
var authResult = await clientApplication.AcquireTokenForClient(scopes).ExecuteAsync();

// The access token is in $authResult.AccessToken

Одним из важных преимуществ является то, что вам не нужно беспокоиться о том, чтобы отслеживать действительность токена, чтобы знать, когда вам нужно получить новый токен. Если вам нужно получить новый токен, просто позвоните AcquireTokenForClient еще раз, и он выяснит, нужен ли ему новый токен, или вы можете использовать тот, который уже кэширован.

1 голос
/ 17 мая 2019

Выполните следующие действия

  1. Перейдите в колонку «Expose a Api» вашего приложения.
  2. Найдите значение URI идентификатора приложения.Скажем, Uri идентификатора приложения: http://abc.pqr
  3. Ваш ресурс для получения токена будет http://abc.pqr/.default
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...