【问题标题】:Can you use Integrated Windows Authentication out-of-browser?您可以在浏览器外使用集成 Windows 身份验证吗?
【发布时间】:2011-05-06 13:57:43
【问题描述】:

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

  1. Silverlight 客户端;这适用于 IWA。
  2. 桌面应用程序

我想在桌面应用程序中使用 IWA,但这可能吗?当它需要协商或 NTLM 时,我收到一条 HTTP 错误消息,说我正在传递匿名。听起来很明显,但我该如何解决这个问题?

【问题讨论】:

  • 如果您发布代码,我们只能帮助您找出代码中的错误。这当然是可能的。
  • 从几个来源看来,您需要在仅将服务器更改为 Windows 身份验证后重新生成服务引用,这样就可以解决问题 - 不过这听起来对我来说并不令人信服。您还可以设置 WCF 客户端对象的 ClientCredentials property
  • @Rup 是正确的,您需要将 IIS 中的网站/应用程序设置为仅接受集成 Windows 身份验证。像这样配置服务和客户端link MSDN 论坛中的答案link 显示客户端代码从您的桌面应用程序发送 Windows 凭据。
  • 对不起,我已经让它与 Silverlight 客户端一起使用。因此,据我所知,IIS 已正确配置。我现在的问题是我的桌面 app.config 中的绑定;它应该只反映 Silverlight 配置文件吗?或者它也应该反映 web.config 文件?因为它听起来好像应该两者兼而有之 - 具有 SL 配置文件所具有的端点,以及 web.config 文件包含的传输模式。

标签: c# wcf iis windows-authentication


【解决方案1】:

你可以这样做。事实证明,您实际上需要将 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>

(显然放在&lt;system.serviceModel&gt; 标签内。

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

【讨论】:

  • 这是用于 OOB 时的 Silverlight 应用程序吗?我遇到了这个问题,而且是在我运行 OOB 时。
  • @RichardB 是的,这是针对 OOB 的。我不特别记得整个解决方案,但绝对有可能。
  • 好的。生病继续挖掘......点击“它在我的机器上工作”但不是 Windows 身份验证的部署问题......试图构建一个快速的 Windows 窗体应用程序,并获得“此服务的安全设置需要'匿名'身份验证但它托管此服务的 IIS 应用程序未启用。"
  • @Harry... 您是否必须将 /clientaccesspolicy.xml 或 /crossdomain.xml 添加到应用程序中?
  • 到目前为止..缩小到 Ninject 服务主机工厂问题...仍在挖掘。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2022-10-18
      • 2022-10-05
      • 2021-05-01
      相关资源
      最近更新 更多