【问题标题】:Getting error: "The account does not have permission to impersonate the requested user" even though i have impersonation access出现错误:“该帐户无权模拟所请求的用户”,即使我有模拟访问权限
【发布时间】: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


【解决方案1】:

我已进一步调查并找到了此问题的根本原因,请参阅下面的详细信息以及如何解决该问题。

  1. 实际上,我已经在我遇到问题的 VM 上安装了 Outlook 并配置了电子邮件帐户(没有模拟访问权限的用户电子邮件帐户),在电子邮件帐户配置后立即重新启动 Outlook 时,它会提示对话框输入凭据,我已输入用户名和密码,同时我还选中了“记住我的凭据”复选框,然后单击确定。
  2. 现在,如果您转到 控制面板\用户帐户\凭据管理器,您将在 Windows 凭据部分看到两个条目,一个用于 Exchange Server 网络地址 (ABCEXCHANGESERVER.DOMAIN.COM) 的用户名与您在 Outlook 中配置的用户名相同,另一个单独的条目与 Windows Identity 的用户名相同。
  3. 当我从 Control Panel\User Accounts\Credential Manager 中删除 Exchange Server 网络地址 (ABCEXCHANGESERVER.DOMAIN.COM) 条目后,此问题得到了解决。
  4. 据我了解,ABCEXCHANGESERVER.DOMAIN.COM 在我们的例子中是交换服务器域/网络地址,由 EWSOutlook 使用访问邮箱时。因此,当我们在 Outlook 和凭据对话框中配置邮箱时,如果我们选中“记住我的凭据”复选框,它会缓存对 ABCEXCHANGESERVER.DOMAIN.COM 的 Exchange 调用以及邮箱配置文件的凭据在凭据管理器中。现在,当我们的服务尝试使用 NTLM 调用 ABCEXCHANGESERVER.DOMAIN.COM 时,它首先检查凭据缓存中的 ABCEXCHANGESERVER.DOMAIN.COM 网络/域地址如果在那里找到任何条目,它总是使用缓存的凭据而不是我们的服务登录凭据。
  5. 如果有人遇到同样的问题,只需从控制面板\用户帐户\凭据管理器中清除 Exchange Server 网络地址条目,此问题就会得到解决。

我的建议是,避免在 VM 上配置 Outlook。 这将如何提供帮助。

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 2013-01-16
    • 2018-04-07
    • 2019-09-18
    • 1970-01-01
    相关资源
    最近更新 更多