Необходимо сгенерировать токен носителя Azure AD с помощью вызова C # rest

Я хочу создать токен-носитель Azure AD с помощью вызова C # REST. Я хочу написать логику регистрации пользователя внутри вызова API. Я использую это как конечную точку токена:

https://login.windows.net/[tenant-id]/oauth2/token

Я выполнил ту же процедуру, что описана в эту статью.

Я использую учетные данные пользователя «Глобальный администратор».

Но я все еще получаю сообщение об ошибке «Несанкционировано». Ниже приведены фрагмент кода и тело ответа.

Код

using (HttpClient client = new HttpClient())
        {
            var tokenEndpoint = @"https://login.windows.net/<tanent-name>/oauth2/token";
            var accept = "application/json";

            client.DefaultRequestHeaders.Add("Accept", accept);
            string postBody = @"resource=https%3A%2F%2Fgraph.microsoft.com%2F
              &client_id=<client-id>
              &grant_type=password
              &username=<admin-user-name>
              &password=<admin-pass>
              &scope=openid";

            using (var response = await client.PostAsync(tokenEndpoint, new StringContent(postBody, Encoding.UTF8, "application/x-www-form-urlencoded")))
            {
                if (response.IsSuccessStatusCode)
                {
                    var jsonresult = JObject.Parse(await response.Content.ReadAsStringAsync());
                    var token = (string)jsonresult["access_token"];
                    return token;
                }
                else
                    return null;
            }
        }

Тело ответа

{ StatusCode: 401, ReasonPhrase: 'Unauthorized',
  Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Pragma: no-cache
  Strict-Transport-Security: max-age=31536000; includeSubDomains
  X-Content-Type-Options: nosniff
  x-ms-request-id: cabefe46-ff73-4659-80a2-2f4136200900
  Cache-Control: no-store, no-cache
  P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
  Set-Cookie: esctx=AQABAAAAAADX8GCi6Js6SK82TsD2Pb7...
  Set-Cookie: x-ms-gateway-slice=004; path=/; secure; HttpOnly
  Set-Cookie: stsservicecookie=ests; path=/; secure; HttpOnly
  Server: Microsoft-IIS/10.0
  X-Powered-By: ASP.NET
  Date: Thu, 24 May 2018 13:43:39 GMT
  Content-Length: 457
  Content-Type: application/json; charset=utf-8
  Expires: -1
}}

P.S.- Также укажите, есть ли другой способ добавить нового пользователя без вызова REST. Я не хочу регистрировать пользователя в клиентском приложении.

[Обновление] Пожалуйста, найдите снимок экрана с добавленными разрешениями и ролями. Разрешения и роли


person Sudip    schedule 24.05.2018    source источник
comment
Есть ли конкретная причина не использовать ADAL.NET?   -  person evilSnobu    schedule 25.05.2018
comment
Поскольку вы используете поток грантов ROPC, является ли этот пользователь владельцем этого клиента (приложение AAD)?   -  person Wayne Yang    schedule 25.05.2018
comment
Я пытаюсь использовать Graph API для добавления нового пользователя. Пожалуйста, проверьте обновленные снимки экрана на наличие добавленных ролей и разрешений.   -  person Sudip    schedule 25.05.2018
comment
@evilSnobu У меня нет причин не использовать ADAL.NET. Не могли бы вы привести мне пример того, как создать пользователя с помощью ADAL.NET в самом API?   -  person Sudip    schedule 25.05.2018
comment
Сначала перетащите этот URL-адрес в свой браузер, вы должны получить экран одноразового согласия.   -  person evilSnobu    schedule 25.05.2018
comment
Привет, @evilSnobu пробовал это. Получение этой ошибки AADSTS90056: эта конечная точка принимает только запросы POST, OPTIONS. Получен запрос GET ..   -  person Sudip    schedule 25.05.2018
comment
Правильно. Вместо этого должно быть login.microsoftonline.com. Нажмите кнопку «Предоставить согласие» на шаге 6. Я вижу, что вы используете разрешения для приложений, я не думаю, что потоку паролей это нужно, скорее всего, нужны делегированные разрешения. Чтобы использовать разрешения приложения, вам необходимо переключиться на поток учетных данных клиента (идентификатор приложения и секрет приложения). Это полностью поддерживается в ADAL.   -  person evilSnobu    schedule 25.05.2018


Ответы (2)


Как упоминал Том, ваша проблема может быть вызвана тем, что у пользователя нет разрешения на ваше приложение.

Поскольку вы используете поток предоставления ROPC, убедитесь, что пользователь является владельцем этого клиента / приложения AAD.

Вы можете добавить в приложение AAD:

Перейдите на портал Azure> Каталог Azure Acitve> Регистрация приложения> Приложение> Параметры> Владельцы> Добавить владельца> Выберите этого пользователя.

Кроме того, если пользователь включил MFA, этот поток не будет работать.

Сообщите мне, если это поможет!

person Wayne Yang    schedule 25.05.2018
comment
Привет, @Wayne, я добавил этого пользователя как владельца приложения. Но он по-прежнему дает ту же ошибку. Пожалуйста, найдите обновленные скриншоты для справки. - person Sudip; 25.05.2018
comment
Привет @Sudip. Какое у вас приложение? - person Wayne Yang; 25.05.2018
comment
Я тестирую консольное приложение (.NET 4.6). Позже я перенесу код в логику веб-API. - person Sudip; 25.05.2018
comment
Гм ... вам лучше зарегистрировать свое приложение с помощью собственного приложения. - person Wayne Yang; 25.05.2018
comment
Хорошо .. попробую это. Я буду держать вас в курсе. - person Sudip; 25.05.2018
comment
Кроме того, я не на 100% уверен, что потоку ROPC нужны делегированные разрешения. Попробуйте добавить делегированные разрешения и нажмите предоставить разрешения. - person Wayne Yang; 25.05.2018

Также укажите, есть ли другой способ добавить нового пользователя без вызова REST. Я не хочу регистрировать пользователя в клиентском приложении.

Если вы хотите создать пользователя, мы могли бы использовать для этого Microsoft.Graph.

Перед этим нам нужно зарегистрируйте приложение Azure AD. И добавьте разрешение Microsoft graph. Для получения дополнительных сведений см. Создать User API.

Я тестирую его с разрешением Directory.ReadWrite.All. Не забудьте Предоставить разрешения.

введите описание изображения здесь

Демо-код.

string graphResourceId = "https://graph.microsoft.com/";
string authority = "https://login.microsoftonline.com/{0}";
string tenantId = "tenant Id";
string clientId = "client Id";
string secret = "secret";
authority = String.Format(authority, tenantId);
AuthenticationContext authContext = new AuthenticationContext(authority);
var accessToken = authContext.AcquireTokenAsync(graphResourceId, new ClientCredential(clientId, secret)).Result.AccessToken;
            var graphserviceClient = new GraphServiceClient(
                new DelegateAuthenticationProvider(
                    requestMessage =>
                    {
                        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);

                        return Task.FromResult(0);
                    }));
var user = new User
         {
             UserPrincipalName = "[email protected]",
             AccountEnabled = true,
             DisplayName = "tom1",
             PasswordProfile = new PasswordProfile
             {
                 ForceChangePasswordNextSignIn = true,
                 Password = "1234qweA!@#$%6"
             },
              MailNickname = "tomaccount1"
            };
 var addUserResult = graphserviceClient.Users.Request().AddAsync(user).Result;

Результат теста:

введите описание изображения здесь

Проверка из Azure AD

введите описание изображения здесь

Packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Graph" version="1.9.0" targetFramework="net471" />
  <package id="Microsoft.Graph.Core" version="1.9.0" targetFramework="net471" />
  <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.19.4" targetFramework="net471" />
  <package id="Newtonsoft.Json" version="11.0.2" targetFramework="net471" />
  <package id="System.IO" version="4.3.0" targetFramework="net471" />
  <package id="System.Net.Http" version="4.3.3" targetFramework="net471" />
  <package id="System.Runtime" version="4.3.0" targetFramework="net471" />
  <package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net471" />
  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net471" />
  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net471" />
  <package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net471" />
</packages>
person Tom Sun - MSFT    schedule 25.05.2018
comment
Спасибо, но сейчас я кое-что застрял. Я обязательно попробую это сделать и буду держать вас в курсе. - person Sudip; 25.05.2018