使用UserNameOverTransport保护Silverlight WCF SOAP服务在HTTP上工作,以实现网络体系结构

使用UserNameOverTransport保护Silverlight WCF SOAP服务在HTTP上工作,以实现网络体系结构,silverlight,wcf,security,wcf-security,Silverlight,Wcf,Security,Wcf Security,我有一个Silverlight 4应用程序,它使用WCF SOAP服务。每次调用都会进行身份验证/授权(准RESTful)。这是通过使用authenticationMode=UserNameOverTransport实现的-这基本上意味着用户名/密码在每个WCF调用中,但受每个消息的SSL加密保护。这个方案的好处在于,我可以在我的web.config中配置一个成员资格提供程序来进行身份验证,这使得它可以灵活地用于不同的安装 我有一个客户端,希望在他们的网络上设置此网站,方案是:承载我的应用程序的

我有一个Silverlight 4应用程序,它使用WCF SOAP服务。每次调用都会进行身份验证/授权(准RESTful)。这是通过使用authenticationMode=UserNameOverTransport实现的-这基本上意味着用户名/密码在每个WCF调用中,但受每个消息的SSL加密保护。这个方案的好处在于,我可以在我的web.config中配置一个成员资格提供程序来进行身份验证,这使得它可以灵活地用于不同的安装

我有一个客户端,希望在他们的网络上设置此网站,方案是:承载我的应用程序的面向Internet外部SSL的转发服务器。他们向我保证这是一个通用的体系结构,我相信他们,我不是一个经验丰富的互联网应用程序开发人员

我不知道该怎么办,因为我的应用程序被设置在启用SSL的服务器上(UserNameWithTransport通过SSL)。在纯HTTP中,我不确定如何获得用户名,我需要该用户名来提供特定于用户的应用程序数据。WCF不提供“UsernameWithNotTransport”身份验证模式,因为这意味着以纯文本形式发送用户名/密码,这很愚蠢。现在,我的服务器端代码从ServiceSecurityContext.Current.PrimaryIdentity.Name获取用户,知道web服务器已经处理了SSL加密和用户身份验证。如何在HTTP解决方案中以有意义的方式完成这项工作

我想要一个解决方案,允许我从web.config配置我的解决方案在HTTP和HTTPS两种情况下工作,如果这是不可能的,那么任何其他建议都是非常感谢的。谢谢

我将在几天后悬赏这个问题,如果你在这之前给出一个好的答案,你就会得到它

编辑:以下是请求的web配置:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <system.web>
        <pages controlRenderingCompatibilityVersion="4.0" clientIDMode="AutoID"/>
    <membership defaultProvider="SampleProvider">
      <providers>
        <add name="SampleProvider" type="MyNamespace.NullMembershipProvider, MyDLL"/>
      </providers>
    </membership>    
  </system.web>

  <appSettings>
    ...
  </appSettings>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <bindings>
      <customBinding>
        <binding name="BinaryCustomBinding" sendTimeout="00:10:00">
          <security authenticationMode="UserNameOverTransport"/>
          <binaryMessageEncoding />
          <httpsTransport maxBufferSize="100000" maxReceivedMessageSize="100000" />
        </binding>
      </customBinding>
    </bindings>

    <services>
      <service name="MyNamespace.MyService">
        <endpoint
                    binding="customBinding" bindingConfiguration="BinaryCustomBinding"
                    name="MyService" contract="MyNamespace.IServiceContract" />
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata
            httpsGetEnabled="true"
            httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <userNameAuthentication
              userNamePasswordValidationMode="MembershipProvider"
              membershipProviderName="SampleProvider"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel> 


  <log4net>
...
  </log4net>
</configuration>

...
...

在.NET4中允许通过HTTP进行
用户名过度传输
,但我认为在Silverlight中不可能。您需要设置安全元素的
allowInsecureTransport
属性:

<customBinding>         
  <binding name="BinaryCustomBinding" sendTimeout="00:10:00">           
    <security authenticationMode="UserNameOverTransport" allowInsecureTranposrt="true"/>             
    <binaryMessageEncoding />           
    <httpTransport maxBufferSize="100000" maxReceivedMessageSize="100000" />           
  </binding>       
</customBinding>


问题在于
allowInsecureTranposrt
。没有这个,你就不能在不安全的频道上使用用户名令牌。

你能发布你当前的服务配置吗?@Ladislav我已经添加了web.config,还需要什么吗?谢谢这是用二进制编码配置SOAP服务,而不是REST服务。@Ladislav,对不起-我想我对RESTful的理解不是很好。我应该说它是一个无状态的SOAP服务。二进制编码仅仅是为了提高速度。是的,这与我在问题中阐述的一致(我没有提到allowInsecureTransport的名称,但我知道这不是一个选项)。Silverlight不允许它在通道中,所以我不能只是更改设置并让它工作。我需要做点别的事。我认为应该有一种方法,显然这不是一个微不足道的改变)@Alex:你必须放弃UserNameOverTransport,建立自己的身份验证机制。复杂性将基于WCF安全管道中的集成质量。简单的解决方案是从客户端和自定义消息检查器传递自定义SOAP头,以验证来自该头的凭据-此解决方案完全在WCF安全管道之外。对。还有其他的解决方案,它们都非常丑陋。这家伙很好地说明了问题和解决方案。所有这些都是一个比我想要的更大的变化。由于这方面的主要驱动因素是避免购买另一个SSL证书(除了一些安全问题),因此我想我将对此进行回击。谢谢