web-dev-qa-db-ja.com

WCF:認証が失敗したため、セキュリティトークンの要求を満たすことができませんでした

メッセージを送受信する非常にシンプルなWCFサービスを作成しました。私はVS 2008のデフォルトのWebサーバーホストを介してアプリをテストしましたが、すべて正常に動作します。しかし、WCFサービスを別のコンピューターのIIS=に展開すると、次のエラーが表示されます。

"認証が失敗したため、セキュリティトークンの要求を満たせませんでした。"

認証タイプを設定して、構成ファイルでカスタムのユーザー名とパスワードを使用するにはどうすればよいですか?それが不可能な場合は、使用している2台のコンピューターが同じユーザーを共有していないため、Windows資格情報の設定方法を教えてください。

28
mrtaikandi

バインディングのセキュリティをオフにする必要があります。それ以外の場合は、デフォルトでwsHttpBindingがセキュリティコンテキストトークン(SCT)のネゴシエーションを試みると思います。

したがって、バインディング構成セクションを指すようにエンドポイント定義を変更します。次に例を示します。

<endpoint address="" 
          binding="wsHttpBinding" 
          contract="HelloWorldService.IService1"
          bindingConfiguration="TheBindingConfig">

次に、web.configの<services>セクションの<system.serviceModel>セクションの直後に、次のバインディング構成のようなものを追加します。

<bindings>
  <wsHttpBinding>
    <binding name="TheBindingConfig">
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

セキュリティを「なし」に設定することが重要です。

これが役に立てば幸い!


上記は私を助けました-しかし、すぐに明らかではないのはserviceの最後にどのように追加するかです(必要なことを行った後、それが完了するまでは明らかではありません)。完全に明白ではない理由は、デフォルトではbindingsセクションがないのに対して、クライアントに1つある可能性があるためです。

したがって、非常に明確にするために-サービスの終わりに、(上記のように)bindingsセクションを追加し、適切なエンドポイントにbindingConfiguration = "TheBindingConfig"属性を追加します。一度やったら明らかです...

31
Mark

実際にはセキュリティをオフにする必要はなく、場合によってはオフにする必要もありません。 bindingConfiguration内で、セキュリティコンテキストを確立しないメッセージレベルのセキュリティを次のように指定できます。

<security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
    <message clientCredentialType="Windows" negotiateServiceCredential="true"
        algorithmSuite="Default" establishSecurityContext="false" />
</security>

EstablishedSecurityContext属性に注意してください。クライアントとサービスの両方に、セキュリティ設定があり、establishSecurityContextが同じ値に設定されている必要があります。 trueの値も正常に機能しますが、サーバーが負荷分散されている環境ではfalseをお勧めします。

20
Frank Sampson

このbindingConfiguration(セキュリティモード 'none'を指定)を必ずbothクライアントとサーバーに設定してください。そうしないと、このメッセージが表示されます。これは、問題。

メッセージを処理できませんでした。これは、アクション ' http://tempuri.org/IInterfaceName/OperationName 'が正しくないか、メッセージに無効または期限切れのセキュリティコンテキストトークンが含まれているため、またはバインディング間に不一致があるために発生する可能性があります。サービスが非アクティブのためにチャネルを中止した場合、セキュリティコンテキストトークンは無効になります。サービスがアイドルセッションを中止しないようにするには、サービスエンドポイントのバインディングの受信タイムアウトを早めに増やします。

12
Simon_Weaver

デバッグモードの場合は、デバッグ属性を次のように設定します。

<serviceDebug includeExceptionDetailInFaults="true"/>

デフォルトではfalse ..soに設定されますが、デバッグに行くと例外がスローされます。

それが役に立てば幸い 。

0
Kenta