由于身份验证失败,无法满足安全令牌请求;一个安装工作​​,一个没有

时间:2014-12-19 17:18:47

标签: .net web-services wcf

一些背景知识:

我们正在将相当复杂的网络服务架构迁移到较新的Windows服务器。一些网站/服务已从IIS6移至IIS7,作为其中的一部分。所以新机器,相同的配置,可能是不同版本的IIS。

所有代码都已重新编译(未更改)到VS2012 / .NET 4.0中。 这是C#和VB.NET的混合。

我们有一个具有以下配置的WCF Web服务。

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<extensions>
  <behaviorExtensions>
    <add name="caller" type="xxx.CallerBehaviorExtensionElement, xxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </behaviorExtensions>
</extensions>
<behaviors>
  <endpointBehaviors>
    <behavior name="caller">
      <caller />
    </behavior>
 <clientCredentials>
  <serviceCertificate>
   <authentication revocationMode="NoCheck" />
  </serviceCertificate>
  <windows allowedImpersonationLevel="Delegation" />
 </clientCredentials>
</behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="xxxWcfBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service behaviorConfiguration="xxxWcfBehavior" name="xxxWcf">
    <endpoint address="" behaviorConfiguration="caller" binding="wsHttpBinding" contract="xxxWcf">
      <identity>
        <dns value="localhost" />           
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

从ASMX Web服务(1)调用此方法可以正常工作。 从ASMX Web服务(2)调用此方法不起作用,返回以下异常:

  

System.ServiceModel.Security.SecurityNegotiationException:调用者未经过服务身份验证。 ---&GT;   System.ServiceModel.FaultException:无法满足安全令牌请求,因为身份验证失败。

这是客户端的web.config:

 <system.serviceModel>
  <extensions>
    <behaviorExtensions>
      <add name="caller" type="xxxx.CallerBehaviorExtensionElement, xxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
    </behaviorExtensions>
  </extensions>
  <behaviors>
    <endpointBehaviors>
      <behavior name="caller">
        <caller />
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <bindings>
    <wsHttpBinding>
      <binding name="xxxDataWcf" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
        <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
        <security mode="Message">
          <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
          <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
    <client>
        <endpoint address="http://xxxDataWcf.svc"
            binding="wsHttpBinding" bindingConfiguration="xxxDataWcf"
            contract="xxxDataWcf" name="xxxDataWcf">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>

    </client>
</system.serviceModel>

但是(1)和(2)之间的区别是什么?我什么都不会建议。多人比较了IIS配置(这发生在v6和v7之间),比较了web.configs,创建了测试项目和比较权限。

我是否已经破坏了是否包含CallerBehaviorExtensionElement。我确定它不相关但包含它,因为删除它会使配置无效到无益的程度。所有这些都是在不依赖委托/ ASP.NET身份验证的情况下跨越啤酒花传递用户名的作弊。要明确的是,这不会形成授权,也不会与Windows相互作用。授权基础设施以任何方式。我们只是用它来用来电者的用户名标记最终记录。

根据我们之前的调查:

似乎错误的股票反应是削弱安全性,我们不愿意这样做。这在IIS6配置中运行良好,并且在IIS7下的本地开发机器上工作正常(奇怪的是,甚至跨越机器/ OS边界)。所以它原则上有效。

我们正在打击我们的头脑并向社区寻求暗示。如果您需要任何具体信息,请询问。这是WCF,我确定你会发现配置非常嘈杂。

1 个答案:

答案 0 :(得分:2)