WCF和<identity impersonate =“true”> </identity>

时间:2009-09-01 02:59:57

标签: c# .net asp.net wcf

这两行web.config代码之间有什么区别 1。

<identity impersonate="true" /> 

2

<identity impersonate="true" userName="MyUserName" password="MyPassword"/>  

MyuserName和MyPassword是我的Windows凭据。如果你有IIS设置使用Windows凭据不应该“1”。传递我的Windows凭据,因此与“2”相同?

当我在尝试连接到我的WCF服务时使用“1”并出现身份验证错误时,我的应用程序正在死亡。我的服务中的代码显然没有任何问题,并且将我的服务称为“2”的代码工作正常,并将客户端凭据传递给我的WCF服务。

网站的IIS配置是为Windows身份验证设置的,其运行的用户是可信任的。

那么如何在没有硬编码的情况下通过我的Windows凭证?

2 个答案:

答案 0 :(得分:6)

您所看到的是授权问题。如果你使用

<identity impersonate="true" />

然后会发生什么是您的ASP.NET页面将在登录用户的凭据下运行(假设Windows身份验证)。但是,这些凭据不会传递到应用程序之外的任何调用,例如与SQL的连接或与WCF服务的连接。您需要使用传递给ASP.NET的凭据,然后在调用Web服务之前使用模拟;

using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
{
    WCFTestService.ServiceClient myService = new WCFTestService.ServiceClient();
    Response.Write(myService.GetData(123) + "<br/>");
    myService.Close();
}

WCF Security Patterns and Practices网站上有更多详细信息。

答案 1 :(得分:5)

如果您阅读有关ASP.NET identity impersonation的MSDN页面,您会注意到如果<identity>元素不包含凭据,ASP.NET将模拟IIS传递给它的令牌,可以是请求身份验证用户的身份或匿名Internet用户帐户(IUSR_machinename)。在我看来,在上面的场景1.中,ASP.NET正在获取匿名用户令牌,这将解释失败。您可以尝试禁用对Web服务的匿名访问,以强制启动WIndows身份验证。