我有一个运行的WCF服务,托管在IIS7上,使用netTcp端点公开,并使用Windows身份验证(Transport
安全性和clientCredentialType="Windows"
)进行配置,这一切都正常。
在服务中,我使用EWS API发送电子邮件,并检查Exchange服务器上的收件箱。我有一部分工作,在开发的那一刻,我已经通过创建一个要传入的NetworkCredential
对象手动指定了Credentials属性。
我想要做的是使用调用服务的用户的身份,以便我可以发送邮件并迭代他们的收件箱。
我可以使用
访问主叫用户详细信息ServiceSecurityContext.Current.PrimaryIdentity
但这会返回IIdentity
对象,而不是我创建与Exchange服务器连接所需的凭据。
我显然无法创建没有密码的NetworkCredential
对象,我没有密码,而且从我看到的内容我无法从NetworkCredential
对象创建IIdentity
。 / p>
必须有办法实现这一目标。欢迎所有建议。
答案 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帐户。她来了几个链接:Here,here,and here