我已经构建了一个WCF发布订阅主题服务,并且可以使用控制台应用程序成功发布/订阅(意味着我知道它至少可以在控制台中运行),并且可以在我的Silverlight应用程序中成功添加两个服务引用。
问题:
每次我尝试订阅或发布(换句话说,任何时候,我通过我的用户名和密码),使用Silverlight时,ServiceSecurityContext.Current.PrimaryIdentity为NULL,但它在控制台中工作正常。此外,在访问服务时,从Silverlight访问服务时,它不会访问我的自定义用户名和密码验证程序,但它可以从控制台进行。
我的要求是什么?
我需要通过Silverlight使用我的发布订阅服务。 WCF服务需要用户UserName身份验证。 WCF服务需要尽可能安全,同时仍允许使用Silverlight。我必须使用.Net,我必须使用WCF PubSubTopic,我必须使用Silverlight。
我愿意创建多个订阅者端点(例如,可能是SL使用的自定义端点,以及我的api用户的另一个端点),但我需要使用与其他api用户相同的发布者(哦是的) ,顺便说一句,WCF服务是作为api构建的,供我的用户访问,如果他们想要...我只允许他们访问订阅者,并阻止发布者)
我正在寻找有关当前问题的示例,建议和/或故障排除帮助。这是我的一些代码
Silverlight的VB.NET代码试图发布一些东西
Private Const PUBLISHER_ENDPOINT_ADDRESS As String = "http://myserver/portal/api/v1/Publisher.svc"
Friend Shared Sub PublishSomething()
Dim binding As PollingDuplexHttpBinding = New PollingDuplexHttpBinding()
Dim endpoint_address As EndpointAddress = New EndpointAddress(PUBLISHER_ENDPOINT_ADDRESS)
Dim client As New PublisherClient(binding, endpoint_address)
client.ClientCredentials.UserName.UserName = String.Format("{0}\{1}", Common.CompanyName, Common.UserName)
client.ClientCredentials.UserName.Password = "mypassword"
Dim uUpdate As New PortalPublisherService.UserUpdatedNotification
uUpdate.CompanyID = CompanyId
uUpdate.CompanyName = CompanyName
uUpdate.isAdvisor = True
uUpdate.isMaster = True
uUpdate.MetaNotes = "Testing from silverlight."
uUpdate.updateById = UserId
uUpdate.updateByName = UserName
uUpdate.userEmail = "bill@domain.com"
uUpdate.userId = UserId
client.UserUpdateAsync(uUpdate)
End Sub
这是来自服务的web.config
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
<protocolMapping>
<add scheme="http" binding="wsDualHttpBinding"/>
</protocolMapping>
<extensions>
<bindingExtensions>
<add name="pollingDuplexHttpBinding"
type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,
System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</bindingExtensions>
</extensions>
<behaviors>
<serviceBehaviors>
<!--primary behavior-->
<behavior name="Portal.Api.Behavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<serviceCertificate findValue="PortalApiCert" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName"/>
<clientCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/>
</clientCertificate>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Portal.Web.UserPassAuth, Portal.Web"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<pollingDuplexHttpBinding>
<binding name="pollingBindingConfig"
closeTimeout="00:01:00"
openTimeout="00:01:00"
receiveTimeout="00:10:00"
sendTimeout="00:01:00"
transferMode="Buffered"
hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="5242880"
maxBufferSize="655360"
maxReceivedMessageSize="655360">
<readerQuotas maxDepth="32"
maxStringContentLength="81920"
maxArrayLength="163840"
maxBytesPerRead="16384"
maxNameTableCharCount="163840" />
<security mode="TransportCredentialOnly" />
</binding>
</pollingDuplexHttpBinding>
</bindings>
<services>
<!--publisher endpoint configuration settings-->
<service behaviorConfiguration="Portal.Api.Behavior" name="Portal.Web.Publisher">
<endpoint address="" binding="pollingDuplexHttpBinding" contract="Portal.Publisher.IPublisher" bindingConfiguration="pollingBindingConfig"/>
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="meta"/>
<host>
<baseAddresses>
<add baseAddress="http://server/portal/api/v1/IPublisher"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
我想强调一点,我已经尝试过,百万种不同的配置,但是不记得我尝试过的每一种组合。我知道我在配置中做了一些我不应该做的事情,但我只是想让它上班。此外,这里是我已经看过的链接
还有更多,但是......嗯......这是漫长的一天......
提前感谢您提供任何帮助
附加说明:
这是我在NON-Silverlight实现中成功使用的绑定
<wsDualHttpBinding>
<binding name="Portal.Api.Binding" maxReceivedMessageSize="2147483647" sendTimeout="00:10:00">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
<security mode="Message">
<message clientCredentialType="UserName" negotiateServiceCredential="false"/>
</security>
</binding>
</wsDualHttpBinding>
答案 0 :(得分:0)
由于没有人回答这个问题,我将以我的发现回答这个问题。我在这里寻找的是RIA服务和Silverlight over HTTPS无法实现的目标。 WCF RIA服务目前不提供此功能。如果你知道这个陈述是不正确的,请用解决方案回答我的上述问题。