2009-06-24 18 views
1

UsernamePasswordValidatorを証明書とともに使用して、WCFサービスへのアクセスを保護しています。UsernamePasswordValidatorを使用してHTTPバインディングをセキュリティで保護しながらMEXバインドを安全に保つ?

ただし、使用しているカスタム認証ポリシーは、エンドポイントの動作ではなくSERVICEビヘイビアであるため、MEXエンドポイントを含むすべてのエンドポイントに適用されます。私たちは毎回サービスの動作をコメントアウトしなくても、ビジュアルスタジオを使ってサービス参照を取得したいと思っていますが、mexとwshttpエンドポイントの両方が保護されているので、 "Add Service Reference .. "

これを回避する方法はありますか?

答えて

1

両方で同じバインディングを使用していますか? MEXエンドポイント用とwshttpのための1 - もしそうなら、2つの別々のバインディングしてみてください: - :

<wsHttpBinding><binding name="wsHttpBindingMessageUname"> 
<security mode="Message"> 
    <message clientCredentialType="UserName" negotiateServiceCredential="true" 
     establishSecurityContext="false" /> 
</security></binding></wsHttpBinding> 

とMEXエンドポイント(保障なし)のために:サービスのためにそう

をのようなもの

それはだ、この設定で

<endpoint address="" behaviorConfiguration="Server.Services.DefaultEndpointBehavior" binding="wsHttpBinding" bindingConfiguration="wsHttpBindingMessageUname" name="DefaultHttp" contract="Server.Services.IMyService" listenUriMode="Explicit" /> 
<endpoint address="mex" binding="customBinding" contract="IMetadataExchange" name="" bindingConfiguration="customMex" listenUriMode="Explicit" /> 

<customBinding><binding name="customMex"> 
<textMessageEncoding> 
    <readerQuotas maxDepth="2147483647" 
      maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647" /> 
</textMessageEncoding> 
<httpTransport transferMode="Buffered" 
       maxReceivedMessageSize="2147483647" 
       maxBufferSize="2147483647"/></binding></customBinding> 

サービスのエンドポイントは次のようになりますmexのセキュリティを適用しないので、サービス参照を更新しようとしているときにそのメッセージを受け取るべきではありません。いずれか、または異なる資格情報、つまりお客様のマシン上のクライアント証明書を使用する別の安全なバインディングを作成します。

次のMSDN投稿には、このサンプルがあります。このblogには、安全なmexエンドポイントに関する詳細があります。

0

サービスビヘイビアを使用していたので、サービス全体でUserNamePasswordバリデータが使用されているため、バインディングの設定は違いはありません。

ここでは2つのことが思い浮かびます。

明示的なMEXバインディングを削除し、サービスの下に追加

<serviceMetadata httpsGetEnabled="true" /> 

または結合MEXを維持する行動、およびメタデータ、 を要求するときにそうであればhttpsgetenabledイマイチで実行

<serviceMetadata httpGetEnabled="true" /> 

CustomUserNameValidator doesntの取得を可能にします、あなたはhttpにmexバインディングを持っている必要があります httpGetenabled on少なくとも

+0

私は思いますそれは私のサービスがすべてサービスレベルを持っているので動作するはずです。serviceCredentials:cert&uname/passを指定するbehaviourConfiguration。その後、サービスエンドポイントでは、behaviourConfigurationを空のエンドポイントの振る舞いに設定する必要があります(名前は必要ありませんが、壊れていないので修正しません)、mexエンドポイントにはbehaviourConfigurationはありません。 – Tanner

+0

これはうまくいくはずですが、ユーザー名は問題ではありません。トランスポート層やメッセージ層のエンコーディング、またはバインディングが使用されているとは思いません。サービスが証明書付きのhttpsが原因です – Neil

関連する問題