Microsoft Graph API тесты - получить доступ от имени пользователя - PullRequest
0 голосов
/ 07 января 2020

У меня есть код, который создает расширение для пользователя с Graph API (. Net Core 3.1). И у меня есть тестовый проект для этого кода. Но мне нужно аутентифицироваться как пользователь, чтобы создать и использовать GraphServiceClient (у пользователя есть роль глобального администратора).

Цель состоит в том, чтобы иметь рабочий код, который создает schemaExtension для Пользователь .

Теперь для создания расширения клиент должен иметь делегированное разрешение Directory.AccessAsUser.All, которое было предоставлено зарегистрированному приложению на портале. Но так как это делегированное разрешение, мне нужно пройти аутентификацию пользователя (в тестовом коде). Поэтому я могу выбрать провайдера аутентификации:

  • Провайдер кода авторизации
  • От имени провайдера
  • Интерактивный провайдер

Для Поставщик кода авторизации:

            List<string> scopes = new List<string> { "Directory.AccessAsUser.All" };

            IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
                .Create(_appClientId.ToString())
                .WithRedirectUri(_redirectUri)
                .WithClientSecret(_appSecret) // or .WithCertificate(certificate)
                .Build();

            AuthorizationCodeProvider authProvider = new AuthorizationCodeProvider(confidentialClientApplication, scopes);
            _graphServiceClient = new GraphServiceClient(authProvider);

Я получаю исключение:

Microsoft.Graph.Auth.AuthenticationException: Код: authenticationChallengeRequired

Для On- имени провайдера:

            IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
                .Create(_appClientId.ToString())
                .WithRedirectUri(_redirectUri)
                .WithClientSecret(_appSecret)
                .Build();

            OnBehalfOfProvider authProvider = new OnBehalfOfProvider(confidentialClientApplication, scopes);

            _graphServiceClient = new GraphServiceClient(authProvider);

Я получаю

NullReferenceException

в этой строке, когда я пытаюсь создать схему:

SchemaExtension extension = await _graphServiceClient .SchemaExtensions.Request().AddAsync(schemaExtension);

Для интерактивного провайдера:

IPublicClientApplication publicClientApplication = PublicClientApplicationBuilder
            .Create(clientId)
            .Build();

InteractiveAuthenticationProvider authProvider = new InteractiveAuthenticationProvider(publicClientApplication, scopes);

Я получаю:

Microsoft.Identity.Client.MsalClientException: поддерживается только URI перенаправления с обратной связью, но urn : ietf: wg: oauth: 2.0: oob был найден. Настроить http://localhost или http://localhost: порт как при регистрации приложения, так и при создании объекта PublicClientApplication.

И этот последний я не делаю понять вообще. Итак, как я могу заставить эту делегированную аутентификацию работать?

Добавление

Вот код, который создает расширение, но оно не зависит от авторизации:

  SchemaExtension schemaExtension = new SchemaExtension
  {
    Id = schemaName.Trim(),
    // Owner = _appClientId.ToString(),    
    Description = string.IsNullOrWhiteSpace(schemaDesc) ? string.Empty : schemaDesc.Trim(),
    TargetTypes = new List<string>
    {
      "User"
    },
    Properties = new List<ExtensionSchemaProperty>
    {
      new ExtensionSchemaProperty
      {
        Name = "isGlobalAdmin",
        Type = "Boolean"
      },
      new ExtensionSchemaProperty
      {
        Name = "isOrganizationAdmin",
        Type = "Boolean"
      }
    }
  };

  SchemaExtension extension = await GraphClient.SchemaExtensions.Request().AddAsync(schemaExtension); // GraphClient here === _graphServiceClient in the code above

1 Ответ

2 голосов
/ 08 января 2020

Согласно моим исследованиям, разные провайдеры для Microsoft Graph используют разные протоколы и подходят для разных сред. Подробнее см. В документе

Для провайдера кода авторизации:

Используется Поток кода авторизации OAuth 2.0 . Обычно мы используем его для ситуации, когда веб-приложение обращается к веб-интерфейсу. Для получения более подробной информации см. документ

Для интерактивного провайдера

Используется Поток кода авторизации OAuth 2.0 . Обычно мы используем его для настольных приложений (таких как WPF). Кроме того, обратите внимание, что при использовании поставщика с MSAL. NET, мы должны зарегистрировать «http://localhost» в качестве URI перенаправления клиента (мобильный и настольный компьютер) Publi c для приложения AD . Для получения более подробной информации, пожалуйста, обратитесь к документу


update

Если мы хотим использовать Interactive провайдера для вызова графа Microsoft, пожалуйста, обратитесь к следующим шагам

  1. Регистрация Azure Приложение AD enter image description here
  2. Настройка разрешений enter image description here

  3. Код

 static async Task Main(string[] args)
        {

            var clientId = "476944ed-e57c-4b2c-b18d-93b5dd5f1bca";
            string[] scopes = { "Directory.AccessAsUser.All" };
            #please provide the redirect url http://localhost when you create the client
            IPublicClientApplication publicClientApplication = PublicClientApplicationBuilder
            .Create(clientId)
            .WithRedirectUri("http://localhost") 
            .Build();

            InteractiveAuthenticationProvider authProvider = new InteractiveAuthenticationProvider(publicClientApplication, scopes);

            var graphClient = new GraphServiceClient(authProvider);
            var schemaExtension = new SchemaExtension
            {
                Id = "courses",
                Description = "Graph Learn training courses extensions",
                TargetTypes = new List<string>()
                    {
                        "Group"
                    },
                Properties = new List<ExtensionSchemaProperty>()
                    {
                        new ExtensionSchemaProperty
                        {
                            Name = "courseId",
                            Type = "Integer"
                        },
                        new ExtensionSchemaProperty
                        {
                            Name = "courseName",
                            Type = "String"
                        },
                        new ExtensionSchemaProperty
                        {
                            Name = "courseType",
                            Type = "String"
                        }
                    }
            };

            var result = await graphClient.SchemaExtensions.Request().AddAsync(schemaExtension);
            foreach (var type in result.TargetTypes) {
                Console.WriteLine(type);

            }

enter image description here

...