从ExchangeWebService基本身份验证迁移到OAuth2.0

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从ExchangeWebService基本身份验证迁移到OAuth2.0相关的知识,希望对你有一定的参考价值。

我的目标是迁移我们的Exchange连接以使用OAuth2.0,因此我们将在2020年删除基本身份验证。

我使用基本身份验证的当前代码是:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
service.Credentials = new WebCredentials(MailBox, Password, "domamer");
try

    service.AutodiscoverUrl(MailBox, RedirectionUrlValidationCallback);

catch

    service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");

在此处查看Microsoft提供的文档:(link)我对以下代码进行了编码,期望它将取代上面的代码。

var pcaOptions = new PublicClientApplicationOptions

    ClientId = AppSettings.GetOauthClientID(),
    TenantId = AppSettings.GetOauthTenantID()
;

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

// The permission scope required for EWS access
var ewsScopes = new string[]  "https://outlook.office.com/EWS.AccessAsUser.All" ;

// Make the interactive token request
var authResult = await pca.AcquireTokenInteractive(ewsScopes).ExecuteAsync();

// Configure the ExchangeService with the access token
var ewsClient = new ExchangeService();
ewsClient.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
ewsClient.Credentials = new OAuthCredentials(authResult.AccessToken);
ewsClient.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, MailBox);

我以为新代码中的“ ewsClient”等同于原始代码中的“ service”。

当我尝试单步执行项目时,它仅在此行结束:

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

我已经仔细检查了我的ClientID,TenantID是否正确。

以前有人遇到过这个问题吗?可能的解决方案或要检查的东西?

我尝试使用Try / Catch希望得到一条错误消息,但是我从来没有碰到我在所有Console.WriteLine上设置的断点。它只是锁定并停止在ExecuteAsync()行响应

try

    // Make the interactive token request
    var authResult = await pca.AcquireTokenInteractive(ewsScopes).ExecuteAsync();

    // Configure the ExchangeService with the access token
    var ewsClient = new ExchangeService();
    ewsClient.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
    ewsClient.Credentials = new OAuthCredentials(authResult.AccessToken);
    ewsClient.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, EmailBox);

    Console.WriteLine("Made it Here");

catch (MsalException ex)

    Console.WriteLine($"Error acquiring access token: ex.ToString()");

catch (Exception ex)

    Console.WriteLine($"Error: ex.ToString()");

答案

我遇到了完全相同的问题。您能够解决并且可以分享您的解决方案吗?

以上是关于从ExchangeWebService基本身份验证迁移到OAuth2.0的主要内容,如果未能解决你的问题,请参考以下文章

如何从浏览器获取基本身份验证信息

如何从 HTTP 基本身份验证中获取密码

HTTP 请求未经客户端身份验证方案“匿名”授权。从服务器收到的身份验证标头是“基本领域”

如何从具有基本身份验证的 rest api 获取数据?

HTTP 请求未经客户端身份验证方案“基本”授权。从服务器收到的身份验证标头是“协商,NTLM”

如何从 AJAX 调用触发浏览器的基本身份验证对话框?