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

C# 通过WCF服务传递NetworkCredential以与EWS API一起使用,c#,wcf,exchangewebservices,C#,Wcf,Exchangewebservices,我有一个WCF服务正在运行,托管在IIS7上,该服务使用netTcp端点公开,并使用Windows身份验证(Transportsecurity和clientCredentialType=“Windows”)进行配置,这一切都可以正常工作 在该服务中,我使用EWS API发送电子邮件,并检查Exchange服务器上的收件箱。在开发过程中,我已经通过创建要传入的NetworkCredential对象手动指定了Credentials属性,这在一定程度上起到了作用 不过,我想做的是使用调用服务的用户的身

我有一个WCF服务正在运行,托管在IIS7上,该服务使用netTcp端点公开,并使用Windows身份验证(
Transport
security和
clientCredentialType=“Windows”
)进行配置,这一切都可以正常工作

在该服务中,我使用EWS API发送电子邮件,并检查Exchange服务器上的收件箱。在开发过程中,我已经通过创建要传入的
NetworkCredential
对象手动指定了Credentials属性,这在一定程度上起到了作用

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

我可以使用

ServiceSecurityContext.Current.PrimaryIdentity
但这将返回一个
IIdentity
对象,而不是创建到Exchange服务器的连接所需的凭据

显然,我无法在没有密码的情况下创建
NetworkCredential
对象(我没有密码),并且从我所看到的情况来看,我无法从
IIdentity
对象创建
NetworkCredential

必须有办法做到这一点。欢迎提出所有建议。

你觉得呢

using(ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
{
    ExchangeService service = new ExchangeService(...)
    service.UseDefaultCredentials = true; 

}
调用服务器的客户端必须允许委派:

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

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

好主意,我很有希望,但这引发了一个异常:
Microsoft.Exchange.WebServices.Data.ExchangeServiceBase的类型初始值设定项引发了一个异常。
什么样的异常?可能需要配置委派以使其正常工作?如果远程客户端连接到服务器,并且服务器调用Exchange服务器(在远程计算机上),则需要为服务器配置委派。这是TypeInitializationException异常:
无法加载文件或程序集的Microsoft.Exchange.WebServices,Version=15.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35'或其依赖项之一。未提供所需的模拟级别,或者提供的模拟级别无效。(HRESULT的异常:0x80070542)
查看
WindowsIdentity
对象
ImpersonationLevel
设置为Identification。那应该是别的吗?