【发布时间】:2018-09-11 14:56:20
【问题描述】:
我有 Windows 服务,它使用 具有模拟访问权限的 EWS 侦听本地 Exchange 邮箱。
我有一个具有模拟访问权限的管理员用户(服务帐户),并且我为我的 Windows 服务登录配置了相同的用户。
我正在使用 C#.Net 中的 NTLM 身份验证 来登录和模拟邮箱。当我启动我的 Windows 服务并尝试模拟邮箱时,即使我对我的服务帐户具有模拟访问权限,我也会收到以下错误。
“Error While initial sync for mailbox SCHEDTEST91@SCHED2010.COM. Exception: Microsoft.Exchange.WebServices.Data.ServiceResponseException: The account does not have permission to impersonate the requested user.
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ProcessWebException(WebException webException)
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request)
at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
at SXA.ES.EWSNotificationListenerService.NotificationListener.NotificationSynchronizerBase.GetCurrentSyncState(String smtpAddress, String autodiscoverUrl)”
令人惊讶的是,这个问题发生在托管我的 Windows 服务的特定虚拟机上。
我总共有 4 台虚拟机和 4 台虚拟机,Windows 服务工作正常并且能够模拟 2 台虚拟机上的邮箱,但是在相同的配置和相同的设置下,其他 2 台出现上述错误。
这是我创建 OnPremise Exchange 服务的代码:
public ExchangeService CreateOnPremiseExchangeService(ExchangeServiceProperties properties)
{
var exchangeService = CreateExchangeService(properties);
exchangeService.UseDefaultCredentials = true;
return exchangeService;
}
private static ExchangeService CreateExchangeService(ExchangeServiceProperties properties)
{
var exchangeService = new ExchangeService(properties.ExchangeVersion)
{
Url = properties.ExchangeUri,
ReturnClientRequestId = true,
SendClientLatencies = true,
UserAgent = properties.UserAgent
};
if (properties.TraceListener != null)
{
exchangeService.TraceListener = properties.TraceListener;
exchangeService.TraceFlags = TraceFlags.All;
exchangeService.TraceEnabled = true;
}
if (!string.IsNullOrWhiteSpace(properties.TargetMailbox))
{
exchangeService.ImpersonatedUserId = new ImpersonatedUserId(
ConnectingIdType.SmtpAddress,
properties.TargetMailbox);
}
return exchangeService;
}
我在谷歌上搜索了很多关于这个问题,但找不到任何帖子。
我在这里寻求帮助来解决这个问题。如果有人在使用 C#.Net 使用 EWS 服务时遇到同样的问题,请告诉我,并为此提供解决方案。
注意:如果我在这里使用基本身份验证,那么它在这 2 个虚拟机上也可以正常工作,这个问题仅发生在 NTLM Windows 身份验证中。
【问题讨论】:
-
如果您只看到 NTLM 的问题,那么很可能是因为您使用的代码(您没有显示)您没有以您认为的用户身份进行身份验证。如果您检查 CAS 服务器上的 EWS 日志,您应该能够看到正在使用的用户。
-
我已使用 Create On Premise Exchange Service 的代码更新了我的帖子
-
使用 UseDefaultCredentials 的问题是您不知道您的应用实际使用的是什么凭据。我建议您检查 EWS 日志以查看 Exchange 服务器看到的凭据。
-
我进一步查看了 Exchange Server 上的 EWS 日志,发现其中一个区别是:当请求从不工作的 VM 发送到 Exchange Server 时,它在 EWS 的 AuthenticatedUser 字段中显示别名 (SCHED2010\SchedTest11)即使我从 C# 代码设置 SMTP 地址,但是当从工作 VM 发送请求时,它会在 AuthenticatedUser 字段中显示 smtp 地址,我怀疑因为它正在发送电子邮件地址的别名,所以这个问题正在发生,我想弄清楚找出为什么会有这种差异,但直到现在还没有得到任何东西。
-
这里是两个 VM 请求的日志行: 不工作日志 : 2018-09-13T19:09:59.044Z,Negotiate,True,SCHED2010\SchedTest11,,Mailbox Group: azuesexc2010exc.sched2010.com/EWS/Exchange.asmxOnPremise ( ExchangeServicesClient/15.00.0847.030),10.202.14.105,AZUESEXC2010EXC 工作日志:2018-09-13T19:32:32.443Z,Negotiate,True,SchedTest11@sched2010.com,,NotificationSynchronizerBase (ExchangeServicesClient/15.00.2013.1.0115,) AZUESEXC2010EXC,SyncFolderItems,200,,SchedTest11@sched2010.com,cc1fdb73c22e4a38bf9704b50f975aa3,0,1,0,0,30000/30000/0%,30000/30000/0%,54000/53955/1%,5400
标签: c# .net windows-services exchangewebservices ntlm-authentication