Мы используем 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 или модульный тест.
Поскольку нас волнует только токен (который работает), неудачное перенаправление браузера просто запутает пользователя. Как нам избавиться от этого?
@Sridevi не помогла. Авторизация работает, браузер не работает.
Какую ошибку вы получаете в браузере? Обычно вы должны увидеть этот экран в браузере, если аутентификация прошла успешно i.imgur.com/4vTzsdz.png
@Sridevi Страница браузера по умолчанию CONNECTION_RESET, а затем CONNECTION_REFUSED.
Вы запускаете его в приложении WPF?
@Sridevi wpf, консоль и unittest в .net 8.
Давайте продолжим обсуждение в чате.





Первоначально я тоже получил ту же ошибку, когда удалил строку 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. Вы можете использовать свое собственное окно.
Не могли бы вы попробовать установить
http://localhostв качестве URI перенаправления на платформе приложений для мобильных и настольных компьютеров и заменить эту строкуWithDefaultRedirectUri()на.WithRedirectUri(redirectUri)?