您可以在浏览器外使用集成Windows身份验证吗?

时间:2011-05-06 13:57:43

标签: c# wcf iis windows-authentication

我有一个由两个客户端使用的WCF服务:

  1. Silverlight客户端;这适用于IWA。
  2. 桌面应用程序
  3. 我想在桌面应用程序中使用IWA,但这可能吗?我收到一条HTTP错误消息,说我正在传递Anonymous,当它想要Negotiate或NTLM时。听起来很明显,但我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:4)

你可以这样做。事实证明,您需要将web.config和客户端配置文件混合到桌面应用程序的app.config文件中。

所以你需要添加web.config行:

<system.web>
    <authentication mode="Windows"/>
  </system.web>

<bindings>
      <basicHttpBinding>
        <binding name="winAuthenticationBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" proxyCredentialType="Windows"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

(显然放在<system.serviceModel>标签内。

然后将该绑定与您通常放在客户端配置文件中的客户端端点一起使用。

答案 1 :(得分:0)

虽然这里没有太多可以帮助诊断问题的建议,但我建议您查看此资源并查看您的桌面应用程序缺失的内容: http://msdn.microsoft.com/en-us/library/bb629363.aspx

我的假设是,由于您的Silverlight应用程序在服务器端运行,因此问题是通过网络而不是仅在服务器网络内部传递您的身份验证。另一种可能性是,您的Silverlight应用程序的自定义配置尚未为您的桌面应用程序带来。例如,您可以将配置文件中的身份验证机制从WSDL附带的默认值更改为其他内容。也许这就是Silverlight应用程序开发人员所做的,你只需要模仿它。

答案 2 :(得分:0)

当您的桌面应用程序启动时,您应该在Program.cs中做的第一件事是:

System.Threading.Thread.CurrentPrincipal = new System.Security.Principal.WindowsPrincipal(System.Security.Principal.WindowsIdentity.GetCurrent());

默认情况下,CurrentPrincipal是GenericPrincipal,未经过身份验证。此外,请记住,您还需要在您启动的任何线程上执行该代码。

您还需要配置Wcf以便它连接到您的服务,可能类似于您为Silverlight配置它的方式。