WCF和<identity impersonate ="true"/>

1 .net c# asp.net wcf

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

<identity impersonate="true" /> 
Run Code Online (Sandbox Code Playgroud)

2.

<identity impersonate="true" userName="MyUserName" password="MyPassword"/>  
Run Code Online (Sandbox Code Playgroud)

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

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

网站的IIS配置是为Windows身份验证设置的,其运行的用户是受信任的委派.

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

blo*_*art 6

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

<identity impersonate="true" />
Run Code Online (Sandbox Code Playgroud)

然后会发生什么是您的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();
}
Run Code Online (Sandbox Code Playgroud)

有关WCF安全模式和实践网站的更多详细信息.


Fra*_*nov 5

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