通过 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 一起使用