有没有办法从webHttpBinding wcf服务中的原始浏览器传递域凭据?

时间:2011-07-21 03:48:00

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

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

编辑

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

  

此服务的安全设置需要“匿名”身份验证   但是没有为承载此服务的IIS应用程序启用它。

我应该在IIS中为该路径显式启用Anonymous吗?我认为这会取消我获取域名的努力。

<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>

2 个答案:

答案 0 :(得分:2)

您需要在服务中启用身份验证 - 假设.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将自动传递用户的凭据。但是,在获得401然后发送凭据之前,非IE浏览器将不会匿名访问该站点。初始请求要求在IIS中支持匿名访问,因为WCF处理身份验证机制

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

答案 1 :(得分:0)