1

クライアントがドメインにない場合に、クライアントを wcf サービスに接続する方法の例または説明が必要です。

クライアントでドメイン資格情報を指定する方法があり、wcf サービスが機関 (dc) と通信して、クライアントが安全かどうかを確認できると思います。

msdn の例に従い、メタデータを表示するために接続できます (利用可能な方法) が、wshttpbinding を使用すると、「セキュリティで保護されていない、またはセキュリティが不適切な障害が相手から受信されました」というメッセージが表示されます。

前もって感謝します!

4

3 に答える 3

1

デフォルトでは、wsHttpBindingは Windows 資格情報を使用します。これは、サービスと呼び出し元クライアントの両方が同じドメインのメンバー (または相互信頼関係を持つドメインのメンバー) である場合にのみ機能します。

ユーザー名/パスワードを使用して認証する場合は、次のことを行う必要があります。

  • サービスは、呼び出し元に対してそれ自体を認証し、ユーザー名/パスワードおよびメッセージを交換するための暗号化メカニズムを提供するために証明書を必要とします。そのため、セキュリティ証明書を作成してサーバー マシンにインストールし、構成する必要があります。

    <system.serviceModel>
      <behaviors>
         <serviceBehaviors>
            <behavior name="Internet">
                <serviceCredentials 
                     findValue="MyServiceCertificate"
                     storeLocation="LocalMachine"
                     storeName="My"
                     X509FindType="FindBySubjectName" />
            </behavior>
         <serviceBehaviors>
      <behaviors>
      <services>
          <service name="MyService" behaviorConfiguration="Internet">
             ......
         </service>
      </services>
    </system.serviceModel>
    
  • wsHttpBindingクライアントは、メッセージ セキュリティとユーザー名/パスワード クライアント資格情報を定義する構成をセットアップする必要があります。

    <system.serviceModel>
      <bindings>
         <wsHttpBinding>
            <binding name="UserNameWS">
                <security mode="Message">
                    <message clientCredentialType="UserName" />
                </security>
            </binding>
         <wsHttpBinding>
      <bindings>
      <client>
          <endpoint name="Default"
              address="........."
              binding="wsHttpBinding" bindingConfiguration="UserNameWS"
              contract="........." />
      </client>
    </system.serviceModel>
    
  • サーバー側では、これらのユーザー名/パスワードを認証するメカニズムを設定する必要があります。通常、最も簡単な方法は、ASP.NET メンバーシップ システムを使用することです。

    <system.serviceModel>
      <behaviors>
         <serviceBehaviors>
            <behavior name="Internet">
                <userNameAuthentication
                    userNamePasswordValidationMode="MembershipProvider" />
                <serviceCredentials 
    
       .....
    </system.serviceModel>
    
  • クライアントからの各呼び出しの前に、クライアント側のプロキシでユーザー名/パスワードを設定する必要があります (これは構成で実行できない数少ないことの 1 つです。コードでのみ機能します)。

    proxy.ClientCredentials.UserName.UserName = "YourUserName";
    proxy.ClientCredentials.UserName.Password = "Top$Secret";
    

Codeplex のWCF セキュリティ ガイダンスサイトで、WCF セキュリティのすべてをお読みください。

于 2011-03-04T16:43:57.870 に答える
0

「セキュリティで保護されていない、または誤ってセキュリティで保護された障害が相手から受信されました」というエラーメッセージは、かなり誤解を招くものです。一般的な原因は、クライアントとサーバー間のバインディング構成の違いです。サービス側のweb.configのsystem.serviceModelセクションを確認し、それに合わせてクライアント設定を変更します。

于 2011-03-04T16:37:38.237 に答える
0

メタデータにアクセスできてサービスを呼び出すことができない理由は、おそらくデフォルト構成で WsHttpBinding を使用しているためです。サービスメタデータではなく、サービスの使用にのみ関与するメッセージセキュリティを使用します。Windows 資格情報と Windows セキュリティを使用して、メッセージの暗号化と署名を行います。Windows のセキュリティのため、クライアントとサーバーの両方が同じドメインにある場合にのみ機能します。

クライアントはドメインの一部ではありません。メッセージ セキュリティまたはトランスポート セキュリティのいずれかを使用して Windows 資格情報を送信できます。メッセージ セキュリティの場合はclientCredentialType="UserName"、デフォルトのパスワード バリデータを使用する必要があり、サービス動作で X509 証明書を構成して、暗号化と署名をサポートする必要があります。トランスポート セキュリティの場合、HTTPS (http.sys/IIS で構成された X509 証明書) を使用するか、HTTP 経由で Wi​​ndowsTransportCredentialOnlyユーザー名とパスワードをプレーン テキストとして送信するモードを使用します (これは悪い解決策です)。トランスポート セキュリティ セットの場合clientCredentialType="Basic"

于 2011-03-04T16:45:13.657 に答える