【问题标题】:Is there a way to pass domain credentials from the originating browser in webHttpBinding wcf service?有没有办法从 webHttpBinding wcf 服务中的原始浏览器传递域凭据?
【发布时间】:2011-10-09 21:46:03
【问题描述】:

有没有办法从 webHttpBinding WCF 服务中的原始浏览器传递域凭据? 我认为这应该是可能的,因为当我登录到任何在 IIS 中启用 Windows 身份验证的 aspx 页面时,我可以获得调用用户的域凭据。我将如何以这种方式设置我的 WCF 服务?目前我在 WCF 服务中获得的用户身份是运行 svc 的应用程序池的用户身份吗?

编辑

我没有 .NET 4 -- 我的配置文件在下面,但我仍然收到错误:

此服务的安全设置需要“匿名”身份验证 但托管此服务的 IIS 应用程序未启用它。

我应该在 IIS 中为该路径显式启用匿名吗?我认为这会使我获得域名的努力付诸东流。

<behaviors>
<endpointBehaviors>
    <behavior name="Awesome.Project.OperationsBehavior">
        <enableWebScript />
    </behavior>
</endpointBehaviors>
</serviceBehaviors>
    <behavior name="Awesome.Project.OperationsServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
</serviceBehaviors>
</behaviors>

<services>
      <service behaviorConfiguration="Awesome.Project.OperationsServiceBehavior"
        name="Awesome.Project.Operations">
        <endpoint address="" binding="webHttpBinding" 
         contract="Awesome.Project.Operations" 
         behaviorConfiguration="Awesome.Project.OperationsBehavior" 
         bindingName="windowsSecurityWebHttpBinding">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <!--<endpoint address="mex" binding="mexHttpBinding" 
             contract="IMetadataExchange" />-->
      </service>
</services>

<bindings>
    <webHttpBinding>
        <binding name="windowsSecurityWebHttpBinding">
            <security mode="Transport">
                <transport clientCredentialType="Windows"/>
            </security>
        </binding>
    </webHttpBinding>
</bindings>

【问题讨论】:

  • 谁在调用服务 - 浏览器还是 aspx 页面?
  • 它来自浏览器。
  • 在您的端点中将 bindingName 更改为 bindingConfiguration
  • 更新了我的答案以显示 3.5 版本

标签: asp.net wcf dns wcf-security wcf-client


【解决方案1】:

您需要在服务中打开身份验证 - 假设 .NET 4 将以下内容添加到您的配置中

<bindings>
  <webHttpBinding>
    <binding>
      <security mode="Transport">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>
  </webHttpBinding>
</bindings>

对于 .NET 3.5 或 3.0,您需要

<bindings>
  <webHttpBinding>
    <binding name="webBindingConfig">
      <security mode="Transport">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>
  </webHttpBinding>
</bindings>

<services>
  <service ...>
    <endpoint bindingConfiguration = "webBindingConfig" binding="webHttpBinding" .../>
  </service>
</services>

编辑其他问题:

WCF 通常不会通过非安全传输传递凭据 - 这就是为什么 mode="Transport" 很重要。如果你摆脱它,它与 WebHttpBinding 的 Mode="None" 相同

如果站点被认为在 Intranet 区域中,那么 IE 将自动传递用户的凭据。但是,非 IE 浏览器不会,因此会在获得 401 并发送凭据之前匿名访问该站点。初始请求需要在 IIS 中支持匿名访问,因为 WCF 处理身份验证机制

如果您需要获取 HttpContext,您可以使用Asp.NET Compatibility。但是在 WCF 中,您可以使用 ServiceSecurityContext.Current.PrimaryIdentity.Name 来获取经过身份验证的用户

【讨论】:

  • 他是否也必须在特定操作或整个服务上设置模拟行为属性?
  • 如果他想在服务中查看客户端身份并且浏览器正在调用该服务,那么这就是他需要做的全部 - 如果他想使用客户端身份或aspx 代码正在调用该服务,那么是的,你是对的
  • 啊..好的。一开始并没有注意到这种细微差别。谢谢:)
  • 我努力更新了描述;仍然打嗝 - 也许这在 .NET 4 之前不受支持?
  • 谢谢!我实现了你的改变。我必须摆脱 mode='transport' 以便它可以在普通的旧 http 而不是 https 上工作。不幸的是,我仍然无法使用 HTTPContext 获取当前用户..
【解决方案2】:

【讨论】:

    猜你喜欢
    • 2019-08-26
    • 2010-09-06
    • 1970-01-01
    • 2015-10-24
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2021-04-19
    相关资源
    最近更新 更多