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

时间:2013-03-13 14:56:19

标签: c# wcf exchangewebservices

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

在服务中,我使用EWS API发送电子邮件,并检查Exchange服务器上的收件箱。我有一部分工作,在开发的那一刻,我已经通过创建一个要传入的NetworkCredential对象手动指定了Credentials属性。

我想要做的是使用调用服务的用户的身份,以便我可以发送邮件并迭代他们的收件箱。

我可以使用

访问主叫用户详细信息
ServiceSecurityContext.Current.PrimaryIdentity

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

我显然无法创建没有密码的NetworkCredential对象,我没有密码,而且从我看到的内容我无法从NetworkCredential对象创建IIdentity。 / p>

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

1 个答案:

答案 0 :(得分:3)

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

}

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

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

如果您的WCF服务器使用localSystem或NetworkService帐户运行,您还需要启用" Trusted for delegation" AD中的计算机帐户的属性(通常是网络管理员的工作)。如果它使用其他域用户帐户运行,则需要启用" Trusted for delegation"该帐户的属性并为您的服务器创建服务器主体名称(SPN)。老实说,我从来没有这样做,因为我更喜欢使用NetworkService帐户。她来了几个链接:Herehereand here