2

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

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

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

我可以通过使用来访问呼叫用户的详细信息

ServiceSecurityContext.Current.PrimaryIdentity

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

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

必须有一种方法来实现这一点。欢迎所有建议。

4

1 回答 1

3

关于什么

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

}

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

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

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

于 2013-03-13T16:24:59.717 回答