【问题标题】:WCF and <identity impersonate="true" />WCF 和 <identity impersonate="true" />
【发布时间】:2009-09-01 02:59:57
【问题描述】:

这两行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 凭据通过?

【问题讨论】:

    标签: c# .net asp.net wcf


    【解决方案1】:

    您看到的是委派问题。如果你使用

    <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 网站上有更多详细信息。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好的答案,弗朗西! [--broger]
      • 感谢 Franci,匿名访问实际上已被禁用,并且“集成 Windows 安全性”已被选中。知道为什么它不起作用吗?
      • @KateK 检查 IIS 日志和 Windows 事件日志以获取有关确切错误的更多详细信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多