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

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

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

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

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

Код:

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\идентификатор запроса: ...\r\n\tclient-request-id: ...\r\nClientRequestId: ...\r\n


comment
Можете ли вы проверить токен, например. jwt.ms? Убедитесь, что токен содержит все, что он должен, например, утверждение scp должно содержать необходимые области.   -  person juunas    schedule 20.04.2021
comment
Я новичок в аутентификации на основе токенов, поэтому я не уверен, что должен содержать токен. Тег scp содержит электронную почту Mail.ReadWrite Mail.Send openid profile Tasks.ReadWrite. Может ли проблема заключаться в том, что мне нужно зарегистрировать код VS в Azure или что-то в этом роде?   -  person Jonas    schedule 20.04.2021
comment
Похоже, что может отсутствовать необходимый объем. Проблема в том, что субъект-служба, который использует VS Code (его регистрация приложения), не требует этого. Это общая проблема с локальным использованием этих учетных данных:\ Возможно, вам придется попробовать другой тип учетных данных или использовать аутентификацию учетных данных клиента (секрет/сертификат).   -  person juunas    schedule 20.04.2021
comment
Какая жалость. Но спасибо за вашу помощь.   -  person Jonas    schedule 20.04.2021
comment
Я думаю, вы также можете попробовать https://graph.microsoft.com/User.Read.All в качестве области видимости вместо .default. Это может закончиться ошибкой :\   -  person juunas    schedule 20.04.2021
comment
Да, как сказал @juunas, попробуйте добавить User.Read.All. У вас нет этого требуется разрешение в вашем токене, и я думаю, что проблема в этом.   -  person Shiva Keshav Varma    schedule 20.04.2021
comment
Когда я это делаю, я получаю это сообщение об исключении: Ошибка проверки подлинности VisualStudioCodeCredential: AADSTS65002: Согласие между основным приложением «...» и основным ресурсом «...» должно быть настроено с помощью предварительной авторизации — приложения, принадлежащие и управляемые Microsoft, должны получить одобрение от владельца API, прежде чем запрашивать токены для этого API.   -  person Jonas    schedule 20.04.2021


Ответы (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 в настоящее время просто не подходят для этой цели. Вам понадобятся другие учетные данные или, возможно, используйте учетные данные секрета/сертификата клиента при регистрации собственного приложения.

person juunas    schedule 20.04.2021
comment
Спасибо за вашу обширную помощь. Для локальной отладки в качестве альтернативы можно использовать учетные данные Shared Token Cache. Жаль, что учетные данные Visual Studio не работают. - person Jonas; 20.04.2021