0

「セッション」を使用している IIS でホストされている WCF サービスを使用するクライアント Windows サービスの HTTP 要求ヘッダーに配置された認証 Cookie を取得する際に問題があります。クライアント アプリは、フォーム認証を使用して WCF サービスにアクセスします。認証が成功した後、.ASPXAUTH の Set-Cookie と ASP.NET_SessionId の Set-Cookie を含む HTTP 応答ヘッダーをキャプチャします。これらの Cookie を、WCF サービスに対する後続のすべての要求の HTTP 要求ヘッダーに追加します。Fiddler デバッグ ツールを使用すると、WCF サービスへのすべての要求に対して、2 つの HTTP 要求が送信されることがわかります。最初の HTTP リクエスト ヘッダーには Cookie が含まれていませんが、2 番目の HTTP リクエストには含まれています。web.config の Authorization セクションを「deny users=”?”」に設定してサービスを保護すると、ヘッダーに Cookie が含まれていない最初の HTTP リクエストは、サービスへのアクセスを防止するログインへの「リダイレクト」を強制します。「セッション」の使用に関連していると思われる最初のリクエスト。WCF サービスで「セッション」を無効にすると、WCF 呼び出しごとに 1 つの HTTP 要求しか取得できず、Cookie がヘッダーにあります。WCF サービスに送信されたすべての HTTP 要求ヘッダーで認証から返された Cookie を取得するにはどうすればよいですか? この問題に関するヘルプをいただければ幸いです。WCF サービスに送信されたすべての HTTP 要求ヘッダーで認証から返された Cookie を取得するにはどうすればよいですか? この問題に関するヘルプをいただければ幸いです。WCF サービスに送信されたすべての HTTP 要求ヘッダーで認証から返された Cookie を取得するにはどうすればよいですか? この問題に関するヘルプをいただければ幸いです。

クライアントからのバインディングを含めました。

  <customBinding>
    <binding name="CustomBinding_IMySyncService" receiveTimeout="00:01:00"
      sendTimeout="00:01:00">
      <reliableSession acknowledgementInterval="00:00:30"
                       inactivityTimeout="00:03:00"
                       maxTransferWindowSize="4096" />
      <binaryMessageEncoding maxReadPoolSize="2147483647" maxWritePoolSize="2147483647">
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
          maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      </binaryMessageEncoding>
      <httpsTransport manualAddressing="false" maxBufferPoolSize="2147483647"
        maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
        bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
        keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
        realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
        useDefaultWebProxy="true" />
    </binding>
    <binding name="CustomBinding_AuthenticationService">
      <binaryMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      </binaryMessageEncoding>
      <httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
        maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
        bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
        keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
        realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
        useDefaultWebProxy="true" />
    </binding>
  </customBinding>
4

1 に答える 1

1

セッションとは、バインディングで信頼できるセッションが許可されていることを意味すると思います。信頼できるセッションは、制御できないインフラストラクチャ メッセージを送信します。その動作を変更するには、非常に低いレベルの WCF チャネル スタックに変更を加える必要があります。

Cookie によって処理される ASP.NET セッションを使用する場合は、ASP.NET 互換モードを使用する必要があります。ASP.NET との互換性があっても、WCF は認証が Cookie によって処理されることを想定していません。正しい方法は、各要求を認証することです。また、WCF はデフォルトで Cookie をまったく使用しません。

ASP.NET 互換モードは、古い ASMX Web サービスとの下位互換性として、プレーンな Web サービスで使用することになっています。したがって、WS-Reliable Session などのより高度なプロトコルで動作する必要はありません。信頼できるセッションまたは ASP.NET 互換性のいずれかを使用してください。両方を使用することはできません。

信頼できるセッションを使用すると、既に WCF セッション (単一のサービス インスタンスが同じクライアント プロキシ インスタンスからのすべての要求を処理する) があるため、ASP.NET セッションは必要ありません。組み込みの WCF セキュリティ パイプライン認証資格情報を使用する場合、各メッセージ内でプロキシによって自動的に送信される必要があります。

于 2011-06-10T07:36:47.440 に答える