情况
我们正在对某些 WCF 服务实施不同类型的安全性。ClientCertificate、用户名和密码以及匿名。
我们有 2 个 ServiceBehaviorConfiguration,一个用于 httpBinding,一个用于 wsHttpBinding。(我们有基于声明的安全性的自定义授权策略)作为一项要求,我们需要为每个服务提供不同的端点。3 个带有 httpBinding 的端点和 1 个带有 wsHttpBinding 的端点。
一项服务的示例:
- basicHttpBinding : 匿名
- basicHttpBinding : 用户名和密码
- 基本HttpBinding : BasicSsl
- wsHttpBinding : BasicSsl
注意:我们正在开发 .NET 3.5
问题
第 1 部分:我们不能两次指定同一个服务,一次使用 http 服务配置,一次使用 wsHttp 服务配置。
第 2 部分:我们无法在端点上指定服务行为。(抛出和异常,未找到端点行为......服务行为不能设置为端点行为)
配置
第 1 部分:
<services>
<service name="Namespace.MyService" behaviorConfiguration="securityBehavior">
<endpoint address="http://server:94/MyService.svc/Anonymous" contract="Namespace.IMyService" binding="basicHttpBinding" bindingConfiguration="Anonymous">
</endpoint>
<endpoint address="http://server:94/MyService.svc/UserNameAndPassword" contract="Namespace.IMyService" binding="basicHttpBinding" bindingConfiguration="UserNameAndPassword">
</endpoint>
<endpoint address="https://server/MyService.svc/BasicSsl" contract="Namespace.IMyService" binding="basicHttpBinding" bindingConfiguration="BasicSecured">
</endpoint>
</service>
<service name="Namespace.MyService" behaviorConfiguration="wsHttpCertificateBehavior">
<endpoint address="https://server/MyService.svc/ClientCert" contract="Namespace.IMyService" binding="wsHttpBinding" bindingConfiguration="ClientCert"/>
</service>
</services>
服务行为配置:
<serviceBehaviors>
<behavior name="securityBehavior">
<serviceAuthorization serviceAuthorizationManagerType="Namespace.AdamAuthorizationManager,Assembly">
<authorizationPolicies>
<add policyType="Namespace.AdamAuthorizationManager,Assembly" />
</authorizationPolicies>
</serviceAuthorization>
</behavior>
<behavior name="wsHttpCertificateBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
<serviceAuthorization serviceAuthorizationManagerType="Namespace.AdamAuthorizationManager,Assembly">
<authorizationPolicies>
<add policyType="Namespace.AdamAuthorizationManager,Assembly" />
</authorizationPolicies>
</serviceAuthorization>
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/>
</clientCertificate>
<serviceCertificate findValue="CN=CertSubject"/>
</serviceCredentials>
</behavior>
我们如何在 WsHttpBinding 端点上指定不同的服务行为?或者我们如何以不同的方式将我们的授权策略应用于 wsHttpBinding 和 basicHttpBinding。我们将使用端点行为,但我们不能在端点行为上指定我们的授权策略