为什么应用程序在测试环境中抛出错误,但在使用ASP.NET Web窗体和MSAL的本地计算机上运行良好?

为什么应用程序在测试环境中抛出错误,但在使用ASP.NET Web窗体和MSAL的本地计算机上运行良好?,asp.net,vb.net,webforms,msal,Asp.net,Vb.net,Webforms,Msal,场景: 使用该应用程序,客户可以访问应用程序中的电子邮件并决定保存。为此,我使用了Exchange Web服务管理API。在实现多因素身份验证之前,一切正常。现在程序无法基于用户名和密码访问邮箱 解决方案 为了克服这个问题,我集成了MSAL(Microsoft身份验证库)来获取访问令牌,以便将其与EWS管理的API一起使用来访问电子邮件。我已经在Azure中注册了一个应用程序,并使用了clientID和TenentID。在本地测试时,它工作得非常好。但在开发/测试环境中部署时引发错误。我不知道该

场景:

使用该应用程序,客户可以访问应用程序中的电子邮件并决定保存。为此,我使用了Exchange Web服务管理API。在实现多因素身份验证之前,一切正常。现在程序无法基于用户名和密码访问邮箱

解决方案

为了克服这个问题,我集成了MSAL(Microsoft身份验证库)来获取访问令牌,以便将其与EWS管理的API一起使用来访问电子邮件。我已经在Azure中注册了一个应用程序,并使用了clientID和TenentID。在本地测试时,它工作得非常好。但在开发/测试环境中部署时引发错误。我不知道该怎么办。你能帮我做这个吗

私有函数GetDelegatedExService()作为ExchangeService
如果会话(“EWSOuthToken”)为空,则
Dim调用方作为新的AsyncGetToken(GetDelegatedToken的地址)
'启动异步调用。
将结果变暗为IAsyncResult=caller.BeginInvoke(无,无)
'任何进程的线程都已准备好运行,并且具有更高的优先级,然后休眠(0)将生成处理器并让其运行
线程睡眠(0)
'在此执行附加处理,然后等待WaitHandle发出信号。
result.AsyncWaitHandle.WaitOne()
'调用EndInvoke以检索结果。
Dim returnValue作为字符串=caller.EndInvoke(结果)
会话(“EWSOuthToken”)=返回值
如果结束
Dim ewsClient=新的ExchangeService()
ewsClient.Url=新Uri(“https://outlook.office365.com/EWS/Exchange.asmx")
Dim myToken=会话(“EWSOuthToken”).ToString()
'使用令牌设置OAuthCredentials
ewsClient.Credentials=新的OAuthCredentials(myToken)
返回客户端
端函数
私有函数GetDelegatedToken()作为字符串
Dim PCAOOPTIONS=新的PublicClientApplicationOptions(),带有
{
.ClientId=ConfigurationManager.AppSettings(“appId”),
.TenantId=ConfigurationManager.AppSettings(“TenantId”)
}
Dim redirectUrl=ConfigurationManager.AppSettings(“EBWebURL”)
Dim pca=PublicClientApplicationBuilder_
.CreateWithApplicationOptions(PCAOOptions)_
.WithRedirectUri(重定向URL)_
.Build()
'EWS访问所需的权限范围
Dim token=OpenAuthPopup(pca).GetAwaiter().GetResult()
返回令牌
端函数
私有异步函数OpenAuthPopup(pca作为PublicClientApplication)作为任务。任务(字符串)
范围={”https://outlook.office365.com/EWS.AccessAsUser.All"}
Dim authResult=Await pca.AcquireTokenInteractive(EWSCOpes.ExecuteAsync())
返回authResult.AccessToken
端函数
这是本地测试,用户可以通过Microsoft帐户提示符获取登录信息。他们必须输入组织帐户详细信息,在电话中获取多因素身份验证码,在提示中添加,然后获得身份验证(它只返回一个访问令牌)

但当代码部署到开发/测试环境时。我得到以下错误。它甚至没有提示Microsoft登录。我尝试搜索给定的错误,但无法找出asp.net web应用程序或Microsoft Auth库的实际问题


我对您在问题中描述的技术没有经验,但我会尽力就这个问题向您提出我的建议。据我所知,您粘贴在这里的代码应该在web服务器上运行。在本地测试应用程序时,客户端正在从web服务器请求信息,但web服务器需要首先获取身份验证令牌。屏幕上出现的请求客户端进行身份验证的模式窗口似乎是由

pca.AcquireTokenInteractive(ewsScopes).ExecuteAsync()
此代码在web服务器上运行,显示此弹出窗口的是web服务器。客户端只能输入其凭据,因为测试是在web服务器所在的同一台计算机上进行的。在生产环境中,不允许web应用程序代码打开模式窗口。即使允许,也不会有人与弹出窗口交互

我检查了MSIL库,发现
PublicClientApplication
包含更多的身份验证方法,其中一些方法是非交互式的,例如
AquireTokenByUsernamePassword
。我不知道你如何处理用户手机收到的代码。由于我对图书馆不熟悉,我不能再进一步了解它了

另一个选项可能是让客户端浏览器在
https://outlook.office365.com/EWS.AccessAsUser.All
并以某种方式将授权令牌返回到web服务器。你可能想看看它是否适合你的需要