как получить токен Msgraph с настройками прокси С#

Я использую приложение службы демона C# для чтения событий календаря определенных пользователей с портала Azure.

Теперь приведенный ниже код отлично работает на моем компьютере.

private async Task<string> **AcquireToken**()
{
AuthenticationResult Tokenresult = null;
app = CreateConfidentialClientApplicationBuilder(); 

string[] scopes = new string[] { $"{ApiUrl}.default" };
            
try
{
    Tokenresult = await app.AcquireTokenForClient(scopes)
        .ExecuteAsync();
    return Tokenresult?.AccessToken;
}
catch (MsalUiRequiredException ex)
{
    utils.logger.logEvents("The application doesn't have sufficient permissions "
     + " Did you declare enough app permissions during app creation?"
     + "- Did the tenant admin grant permissions to the application?");
    utils.logger.logEvents(ex.Message);
}
catch (MsalServiceException ex) when (ex.Message.Contains("AADSTS70011"))
{
    utils.logger.logEvents("Scope provided is not supported. Invalid scope. The scope has to be of the form https://resourceurl/.default"
        + "Mitigation: change the scope to be as expected");
}
catch(Exception ex)
{
    utils.logger.logEvents("error in AcquireToken " + ex.Message);
}
return string.Empty;

}

Но тот же код не работает (выдает ошибку тайм-аута) на другом ПК, настроенном с настройками прокси-сервера.

Здесь я не знаю, как настроить приведенный выше код для использования прокси-сервера для доступа к лазурному порталу. (Я гуглил много часов, но НЕ повезло)

поэтому, пожалуйста, сообщите, как настроить метод AcquireTokenForClient() для использования настроек прокси.

Огромное спасибо


person SaddamBinSyed    schedule 03.03.2021    source источник
comment
Этот ответ должен быть поучительным.   -  person Allen Wu    schedule 03.03.2021
comment
Вы сказали, что код отлично работает на вашем компьютере, но не работает на другом компьютере с настройкой прокси, поэтому я думаю, что ошибка исходит от самого компьютера, точно так же, как ваш компьютер подключен к обычной сети, а другой компьютер отключен от сети, так как заставить последний получать услуги из Интернета? И, возможно, я неправильно понимаю вас. Простите за это.   -  person tiny-wa    schedule 03.03.2021
comment
@AllenWu, я получил токен, но когда я пытаюсь получить событие календаря, он говорит: код: InvalidAuthenticationToken, сообщение: Ошибка проверки токена доступа. Недопустимая аудитория. Я передаю параметр Scope как ./default при получении токена   -  person SaddamBinSyed    schedule 04.03.2021
comment
@SaddamBinSyed ApiUrl это https://graph.microsoft.com/?   -  person Allen Wu    schedule 04.03.2021
comment
да., request.AddParameter(scope, ${ApiUrl}.default); я тоже включил это. но не повезло, нужно ли мне указывать значение ресурса вместе с областью действия при получении токена?   -  person SaddamBinSyed    schedule 04.03.2021
comment
@SaddamBinSyed Расшифруйте свой токен доступа в jwt.io, чтобы узнать, что такое утверждение aud.   -  person Allen Wu    schedule 04.03.2021
comment
@AllenWu, запрос aud: 00000002-0000-0000-c000-000000000000 , но в рабочем сценарии (локальное тестирование с идентификатором клиента моей компании), если я декодирую токен, я вижу graph.microsoft.com примерно так.   -  person SaddamBinSyed    schedule 04.03.2021
comment
@SaddamBinSyed Идентификатор Microsoft Graph должен быть 00000003-0000-0000-c000-000000000000, а не 00000002-0000-0000-c000-000000000000. Вы уверены, что ApiUrl это https://graph.microsoft.com/?   -  person Allen Wu    schedule 04.03.2021
comment
да. На 100% уверен, graph.microsoft.com   -  person SaddamBinSyed    schedule 04.03.2021
comment
Давайте продолжим обсуждение в чате.   -  person Allen Wu    schedule 04.03.2021


Ответы (1)


Более поздние версии MSAL поддерживают использование собственной httpClientFactory, см. https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/httpclient, который позволяет настраивать базовые параметры прокси-сервера.

Если у вас есть прокси-сервер с проверкой подлинности, вам нужно быть осторожным с тем, какие учетные данные будет представлять ваше приложение (поскольку вы, вероятно, не хотите жестко кодировать их, как в примере), например, если приложение работает как локальная система, это учетные данные, которые оно будет представлять и т. д. .

person Glen Scales    schedule 03.03.2021