DefaultAzureCredential: доступ к графику запрещен с учетными данными кода VisualStudio

Я пытаюсь прочитать свойства пользователя из графа ms внутри функции Azure. Для аутентификации я использовал класс DefaultAzureCredential из Azure.Identity.

Доступ с помощью учетных данных кэша общих токенов локально и учетных данных управляемой идентификации в Azure не проблема! Я хотел использовать учетные данные кода Visual Studio, но получаю сообщение об ошибке «Authorization_RequestDenied! Недостаточно прав для завершения операции», когда я вызываю API графа.

Проблема, похоже, связана с токеном доступа, который я получил с учетными данными VS Code. Учетная запись пользователя та же, что я использовал с учетными данными Shared Token Cache Credential.

Любые идеи? Спасибо.

Код:

      DefaultAzureCredentialOptions options = new DefaultAzureCredentialOptions();
options.VisualStudioCodeTenantId = Environment.GetEnvironmentVariable("Debug_VisualStudioCodeTenantId");


var credential = new DefaultAzureCredential(options);
token = credential.GetToken(
                    new Azure.Core.TokenRequestContext(
                        new[] { "https://graph.microsoft.com/.default" }));

accessToken = token.Token;


var graphServiceClient = new GraphServiceClient(
            new DelegateAuthenticationProvider((requestMessage) =>
            {
                requestMessage
                .Headers
                .Authorization = new AuthenticationHeaderValue("bearer", accessToken);

                return Task.CompletedTask;
            }));

var users = await graphServiceClient.Users.Request().GetAsync(); // throw the forbidden exception

Исключение:"Код: Authorization_RequestDenied \ r \ nСообщение: недостаточно прав для завершения операции. \ R \ nВнутренняя ошибка: \ r \ n \ tAdditionalData: \ r \ n \ tdate: 2021-04-20T08:02:23 \ r \ n \ trequest-id: ... \ r \ n \ tclient-request-id: ... \ r \ nClientRequestId: ... \ r \ n "

1 ответ

Решение

После проверки токена, возвращаемого VS Code, кажется, что отсутствует необходимое делегированное разрешение / область действия. В документах говорится, что для перечисления пользователей требуется один из них:

User.ReadBasic.All, User.Read.All, User.ReadWrite.All, Directory.Read.All, Directory.ReadWrite.All, Directory.AccessAsUser.All

Поскольку принципалу службы, который использует VS Code, ничего из этого не требуется, он не будет работать. После попытки явно получить токен с требуемой областью, похоже, это тоже не работает.

Таким образом, учетные данные VS Code в настоящее время не подходят для этой цели. Вам понадобятся другие учетные данные или, возможно, используйте учетные данные секрета / сертификата клиента с вашей собственной регистрацией приложения.