我有一个使用WCF SOAP服务的Silverlight 4应用程序。每次调用都会进行身份验证/授权(准RESTful)。这是通过使用authenticationMode = UserNameOverTransport来完成的 - 这基本上意味着该用户名/密码在每个WCF调用中,但受每个消息的SSL加密保护。这个方案的好处在于我可以在web.config中配置一个成员资格提供程序来进行身份验证,使其适用于不同的安装。
我有一个客户想要在他们的网络上设置这个网站,其中的方案是:Internet< = SSL Traffic =>面向外部SSL的转发服务器< =内部网络中的不安全HTTP =>托管我的应用程序的服务器他们向我保证这是一个常见的架构,我相信它们,我不是那个经验丰富的互联网应用程序开发人员。
由于我的应用程序设置为启用SSL的服务器(UserNameWithTransport通过SSL),我不知道该怎么办。在普通的HTTP我不知道如何获得我需要提供用户特定应用程序数据的用户名。 WCF不提供“UserNameWithNoTransport”authenticationMode,因为这意味着以纯文本形式发送用户名/密码,这很愚蠢。现在,我的服务器端代码从ServiceSecurityContext.Current.PrimaryIdentity.Name获取用户,因为他知道Web服务器已经处理了SSL加密和用户身份验证。如何以一种在HTTP解决方案中有意义的方式开展此工作?
我想要一个解决方案,允许我将我的解决方案配置为在web.config的HTTP和HTTPS情况下工作,如果这不可能得到任何其他建议。感谢
我会在几天内给这个问题一个赏金,如果你在那之前给出一个好的答案你就会得到它。
编辑:这是所要求的网络配置:
<?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>
答案 0 :(得分:2)
在.NET 4中允许UserNameOverTransport
通过HTTP,但我认为在Silverlight中不可能。您需要设置security元素的allowInsecureTransport
属性:
<customBinding>
<binding name="BinaryCustomBinding" sendTimeout="00:10:00">
<security authenticationMode="UserNameOverTransport" allowInsecureTranposrt="true"/>
<binaryMessageEncoding />
<httpTransport maxBufferSize="100000" maxReceivedMessageSize="100000" />
</binding>
</customBinding>
问题在于allowInsecureTranposrt
是not available in Silverlight。如果没有这个,你就不能在不安全的通道上使用UserName令牌。