У меня есть код, который создает расширение для пользователя с 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