如何在WCF服务上要求模拟并在服务中设置凭据?

时间:2012-02-09 17:35:42

标签: wcf authentication wcf-security impersonation

我有一个WCF服务,我正在尝试设置一组凭据,这样它们不仅可以用于服务,还可以用于NAS上的所有后续操作。

我目前在方法上设置了属性[OperationBehavior(Impersonation = ImpersonationOption.Required)],并在服务web.config中设置了<identity impersonate="true" userName="DOMAINUSER" password="PASSWORD"/>。由于这是一项内部服务,我不想要求消费者提供特殊凭据,我希望<basicHttpBinding>使用<security mode="None">。问题是,当这样设置时,我收到错误:

The contract operation requires Windows identity for automatic impersonation. 
A Windows identity that represents the caller is not provided by
binding 'BasicHttpBinding' for contract.

如上所述,尽管在web.config中设置了模拟指令,但返回的WindowsIdentity.GetCurrent().Name仍为NT AUTHORITY \ NETWORK SERVICE。它似乎想要从消费者/客户端传递的凭证,而不是从服务中设置。

是否可以将模拟完全包含在服务中,而不是依靠消费者发送凭据?

谢谢!

2 个答案:

答案 0 :(得分:1)

是的,但可以通过任何配置完成。到目前为止您使用的是WCF模拟,其目标仅是模仿客户的身份。

您想要的是使用不同的帐户(可能基于某些逻辑)来访问远程存储。首先,它不是非常安全的方式,因为它需要存储用于访问某些配置文件或注册表中的那些资源的帐户和密码(甚至更糟糕的是 - 硬代码)。您应该使用专为您的应用程序创建的特殊帐户运行您的服务,并且此帐户应具有您需要的每个资源的必要权限。

无论如何,您需要登录your specific account and impersonate it。据我所知,.NET没有用于登录的API - 您必须使用互操作并调用Win API LogonUser方法。

答案 1 :(得分:1)

在服务方法上设置此属性:

[OperationBehavior(Impersonation = ImpersonationOption.Required)]

表示服务代码将模拟客户端的身份。因此,如果您不想使用调用客户端的凭据(似乎就是这种情况),那么您希望将此属性保留在服务方法之外。

听起来是您希望您的服务以特定身份运行,而不管客户的身份如何。

如果设置<identity impersonate="true" userName="DOMAINUSER" password="PASSWORD"/>'不起作用,您可以更改在IIS中运行应用程序的应用程序池的标识。这将导致您的应用程序始终作为该标识运行,前提是没有设置任何服务方法来明确要求模拟。