MSAL AcquireTokenInteractive перенаправляет браузер на недоступный локальный хост

Мы используем AcquireTokenInteractive для подключения к EWS 365 следующим образом:

// using Microsoft.Identity.Client 4.61.1

var pca = PublicClientApplicationBuilder
         .CreateWithApplicationOptions(pcaOptions) // userId, tennantid
         .WithDefaultRedirectUri()
         .Build();
...

var result = await pca.AcquireTokenInteractive(ewsScopes).ExecuteAsync();

Примерно это и делает пример кода, который вы можете найти где-нибудь в Entra. Мы сделали это после этого объяснения Аутентификация и EWS в Exchange.

Все работает нормально, мы получаем токен и все такое. Однако браузер, который использовался для аутентификации, всегда выполняет перенаправление на какой-либо http://localhost:SOMEPORT, что приводит к сбою и, таким образом, отображает сообщение об ошибке.

Что мы здесь делаем не так? Мы не указали на портале ни одного URI перенаправления, и если мы опустим WithDefaultRedirectUri(), мы получим ошибку.

Microsoft.Identity.Client.MsalClientException: «Поддерживается только URI перенаправления обратной связи, но был найден urn:ietf:wg:oauth:2.0:oob. Настройте http://localhost или http://localhost:port как во время регистрации приложения, так и во время при создании объекта PublicClientApplication. Подробности см. https://aka.ms/msal-net-os-browser».

или аналогично, в зависимости от того, используется ли это приложение wpf или модульный тест.

Поскольку нас волнует только токен (который работает), неудачное перенаправление браузера просто запутает пользователя. Как нам избавиться от этого?

Не могли бы вы попробовать установить http://localhost в качестве URI перенаправления на платформе приложений для мобильных и настольных компьютеров и заменить эту строку WithDefaultRedirectUri() на .WithRedirectUri(redirectUri)?

Sridevi 31.05.2024 08:07

@Sridevi не помогла. Авторизация работает, браузер не работает.

CSharpie 31.05.2024 09:06

Какую ошибку вы получаете в браузере? Обычно вы должны увидеть этот экран в браузере, если аутентификация прошла успешно i.imgur.com/4vTzsdz.png

Sridevi 31.05.2024 09:13

@Sridevi Страница браузера по умолчанию CONNECTION_RESET, а затем CONNECTION_REFUSED.

CSharpie 31.05.2024 09:48

Вы запускаете его в приложении WPF?

Sridevi 31.05.2024 09:57

@Sridevi wpf, консоль и unittest в .net 8.

CSharpie 31.05.2024 10:13

Давайте продолжим обсуждение в чате.

Sridevi 31.05.2024 10:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
183
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Первоначально я тоже получил ту же ошибку, когда удалил строку WithDefaultRedirectUri() из кода при получении токена с помощью интерактивного потока:

Чтобы устранить эту ошибку, обязательно добавьте http://localhost в качестве URI перенаправления на платформе «Мобильные и настольные приложения» при использовании интерактивного потока для генерации токена:

В моем случае я запустил приведенный ниже модифицированный код в консольном приложении .NET 8, включив URI перенаправления и получив экран входа в систему для выбора учетной записи:

using Microsoft.Identity.Client;

class Program
{
    private static string _clientId = "appId";
    private static string _tenantId = "tenantId";


    static async Task Main(string[] args)
    {
        var pcaOptions = new PublicClientApplicationOptions
        {
            ClientId = _clientId,
            TenantId = _tenantId
        };

        var redirectUri = "http://localhost";

        var pca = PublicClientApplicationBuilder
            .CreateWithApplicationOptions(pcaOptions)
            .WithRedirectUri(redirectUri)
            .Build();

        var ewsScopes = new string[] { "https://outlook.office365.com/EWS.AccessAsUser.All" };

        try
        {
            var accounts = await pca.GetAccountsAsync();
            AuthenticationResult result;

            if (accounts.Any())
            {
                result = await pca.AcquireTokenSilent(ewsScopes, accounts.FirstOrDefault())
                    .ExecuteAsync();
            }
            else
            {
                result = await pca.AcquireTokenInteractive(ewsScopes)
                    .ExecuteAsync();
            }

            Console.WriteLine("Access Token:");
            Console.WriteLine(result.AccessToken);
        }
        catch (MsalException msalEx)
        {
            Console.WriteLine($"Error Acquiring Token: {msalEx}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error Acquiring Token: {ex}");
        }
    }
}

Выберите аккаунт:

После успешной аутентификации пользователь будет перенаправлен на эту страницу в браузере:

Когда я сейчас проверил консоль вывода, я успешно получил токен доступа следующим образом:

Чтобы подтвердить это, я декодировал токен доступа на веб-сайте jwt.ms, где он имеет утверждения aud и scp, как показано ниже:

Ссылка:

URI ответа по умолчанию — библиотека проверки подлинности Microsoft для .NET | Майкрософт

Нам удалось решить проблему.

Решение:

Включить текущие пакеты:

Microsoft.Identity.Client Версия="4.61.1"

Microsoft.Identity.Client.Broker Version="4.61.1"

Настройте URI перенаправления как «http://localhost».

Используйте этот код:

            private const string EXCHANGE_URL = "https://outlook.office365.com/EWS/Exchange.asmx";
            private const string EXCHANGE_EWS_SCOPE = "https://outlook.office365.com/EWS.AccessAsUser.All";
            private const string Instance = "https://login.microsoftonline.com/";

            var mainWindow = Application.Current.MainWindow;

            BrokerOptions brokerOptions = new BrokerOptions(BrokerOptions.OperatingSystems.Windows);

            var pca = PublicClientApplicationBuilder.Create(ClientId)
                                                                         .WithAuthority($"{Instance}{TenantId}")
                                                                         .WithDefaultRedirectUri()
                                                                         .WithBroker(brokerOptions)
                                                                         .Build();


            // The permission scope required for EWS access
            var ewsScopes = new string[] { EXCHANGE_EWS_SCOPE };

            var op = pca.AcquireTokenInteractive(ewsScopes).WithParentActivityOrWindow(new WindowInteropHelper(mainWindow).Handle);

            // Make the interactive token request
            var authResult = op.ExecuteAsync().Result;
            SOGHotlineException.Check(!authResult.AccessToken.IsNullOrEmpty());

            AccessToken = authResult.AccessToken;

Этому коду нужен WindowHandle. Здесь получено из Application.Current.MainWindow. Вы можете использовать свое собственное окно.

Другие вопросы по теме

Azure IoTEdge — пользовательский модуль IoTEdge не может подключиться к концентратору с ошибкой Communication_Error
Azure Synapse «Содержимое каталога по пути '.../_delta_log/*.*' невозможно отобразить
Развертывание приложения логики (стандартное) через конвейер DevOps — служба kudu недоступна 503
New-AzAutomationSchedule — ссылка на объект не установлена ​​на экземпляр объекта
Аутентификация в Azure с использованием управляемого удостоверения с помощью Terraform
В моем интерфейсе Az Cli для развертывания бицепса в области управления не отображаются изменения во вложенной группе управления
Скрипт Powershell, предназначенный для получения электронных писем всех пользователей и электронных писем менеджеров, принадлежащих к определенной группе безопасности в AD, создает пустой CSV-файл
Поддерживает ли API Microsoft Graph свойство createddatetime для контактов?
GetConnectionStringOrSetting устарел? Какая лучшая замена?
Пользователи не могут пройти проверку подлинности в зоне доступности с помощью ConnectToAzure