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

标签 c# wcf exchangewebservices

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

在该服务中,我使用 EWS API 发送电子邮件,并检查 Exchange 服务器上的收件箱。我已经部分完成了这项工作,到目前为止,在开发过程中,我已经通过创建要传入的 NetworkCredential 对象来手动指定 Credentials 属性。

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

我可以使用访问调用用户详细信息

ServiceSecurityContext.Current.PrimaryIdentity

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

如果没有密码,我显然无法创建一个 NetworkCredential 对象,因为我没有密码,而且从我所看到的情况来看,我无法从 创建一个 NetworkCredential 对象。 >IIdentity 对象。

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

最佳答案

怎么样

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

关于c# - 通过 WCF 服务传递 NetworkCredential 以与 EWS API 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15388762/

相关文章:

javascript - 我如何使用 jquery 读取简单的 json 结果以及如何发布新结果

c# - 使用 EWS 托管 API 将 .msg 文件上传到 Exchange Server

c# - 从基类列表返回引用返回 'nothing'

c# - 如果在 ListView 中未选择任何项目,如何禁用按钮

c# - 我的 WCF 客户端构造函数重载在哪里?

web-services - 将 ASP.net 身份生成的不记名 token 传递给 WCF Restful 服务

c# - SignalR 服务(无服务器)- Azure 函数

c# - 如何访问没有页面扩展名.aspx的页面

javascript - 使用 ews-javascript-api 但不确定如何使用本地时间查询

exchange-server - 使用 EWS API 搜索不同用户的邮箱