通过 WCF 服务传递 NetworkCredential 以与 EWS API 一起使用

Posted

技术标签:

【中文标题】通过 WCF 服务传递 NetworkCredential 以与 EWS API 一起使用【英文标题】:Passing NetworkCredential through WCF service to use with EWS API 【发布时间】:2013-03-13 14:56:19 【问题描述】:

我有一个 WCF 服务正在运行,托管在使用 netTcp 端点公开的 IIS7 上,并使用 Windows 身份验证(Transport 安全性和clientCredentialType="Windows")进行配置,这一切正常。

在服务中,我使用 EWS API 发送电子邮件,并检查 Exchange 服务器上的收件箱。我有这部分工作,就目前而言,我已经通过创建一个 NetworkCredential 对象来手动指定 Credentials 属性以传入。

我想做的是使用调用服务的用户的身份,这样我就可以像他们一样发送邮件并遍历他们的收件箱。

我可以通过使用访问主叫用户详细信息

ServiceSecurityContext.Current.PrimaryIdentity

但这会返回一个 IIdentity 对象,而不是我创建与 Exchange 服务器的连接所需的凭据。

如果没有密码,我显然无法创建NetworkCredential 对象,而我没有密码,而且据我所知,我无法从IIdentity 对象创建NetworkCredential

必须有办法实现这一点。欢迎所有建议。

【问题讨论】:

【参考方案1】:

怎么样

using(ServiceSecurityContext.Current.WindowsIdentity.Impersonate())

    ExchangeService service = new ExchangeService(...)
    service.UseDefaultCredentials = true; 


调用您的服务器的客户端必须允许委托:

proxy.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation;

如果您的 WCF 服务器使用 localSystem 或 NetworkService 帐户运行,您还需要在 AD 中为您的计算机帐户启用“受信任的委派”属性(通常是网络管理员的工作)。如果它使用另一个域用户帐户运行,您需要为该帐户启用“受信任的委派”属性并为您的服务器创建服务器主体名称 (SPN)。老实说,我自己从来没有这样做过,因为我更喜欢使用 NetworkService 帐户。她来了几个链接:Here,here,and here

【讨论】:

好主意,我很有希望,但这会引发异常:The type initializer for 'Microsoft.Exchange.WebServices.Data.ExchangeServiceBase' threw an exception. 什么样的异常?也许您需要配置委托以使其工作? 如果您的远程客户端连接到您的服务器,并且您的服务器调用 Exchange 服务器(在远程计算机上),则需要为您的服务器配置委派。 这是一个 TypeInitializationException 异常:Could not load file or assembly 'Microsoft.Exchange.WebServices, Version=15.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. Either a required impersonation level was not provided, or the provided impersonation level is invalid. (Exception from HRESULT: 0x80070542) 查看WindowsIdentity 对象,ImpersonationLevel 设置为标识。那应该是别的吗?

以上是关于通过 WCF 服务传递 NetworkCredential 以与 EWS API 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

通过 WCF 服务传递 NetworkCredential 以与 EWS API 一起使用

通过 WCF 传递匿名类型的实例

将复杂对象传递到 WCF Rest 服务

通过 WCF 传递图像并将它们显示在 WPF 数据网格中

让 DefaultNetworkCredentials 传递给 WCF 服务

WCF 客户端中传递的多个参数不起作用(即使包装了 WebMessageBodyStyle)