8

HTTPS を使用しているときに、WCF サービスのセッションごとのインスタンスを有効にする方法がわかりません。(私は ASP.NET の専門家ではありませんが、可能であれば ASP.NET セッション状態を使用したくありません。) .NET Framework 3.0 を使用しています。

私は次の矛盾に到達しました。誰かがロジックのどこに欠陥があるか教えてくれることを願っています.

1) クライアントの義務により、サービスは IIS 6 でホストする必要があります。

2) サービスは、SqlConnection および SqlTransaction インスタンスを含む呼び出し間の状態を維持する必要があります (醜いですが、プロジェクトの制約のために必要です)。

3) したがって、wsHttpBinding を使用する必要があります。

4) サービスは、HttpContext.Current.User.Identity からユーザー認証情報にアクセスできる必要があります (例: IIS で Windows セキュリティを使用)。

5) したがって、HTTPS が必要です。

6) したがって、バインディングでトランスポート レベルのセキュリティを構成する必要があります。

7) セッションを要求するようにサービスを構成するということは、信頼できるセッションを使用するように wsHttpBinding を構成する必要があることを意味します。

8) これには、メッセージ レベルのセキュリティがバインディングで構成されている必要があります。

つまり、(6) と (8) は相互に排他的です。

WCF セッションを使用するには、メッセージ レベルのセキュリティを使用する必要があり、HTTPS を使用できないようです。

私は何が欠けていますか?

4

2 に答える 2

16

3)TruewsHttpBindingおよびwsDualHttpBindingは、セッションをサポートする唯一のHTTPバインディングです。

5)False、サービスの呼び出し元を認証するために、必ずしもトランスポートレベルのセキュリティ(SSL / HTTPSなど)を持っている必要はありません。唯一の要件は、仮想ディレクトリに対して統合Windows認証を有効にするようにIISを構成することです。次に、WCFでは、このシナリオを有効にする3つの可能性があります。

a)Windowsクレデンシャル(HTTPS)を使用したwsHttpBindingでトランスポートレベルのセキュリティを使用する

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="SecurityEnabledWsHttp">
                <security mode="Transport">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
</system.serviceModel>

b)Windowsクレデンシャル(HTTP)を使用したwsHttpBindingでメッセージレベルのセキュリティを使用する

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="SecurityEnabledWsHttp">
                <security mode="Message">
                    <message clientCredentialType="Windows" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
</system.serviceModel>

c)ASP.NET互換モードでサービスを実行し、ASP.NET(HTTP)でWindows認証を有効にします

<system.web>
    <authentication mode="Windows" />
</system.web>

abでは、次の方法でサービス内から発信者のIDにアクセスすることに注意してください。

OperationContext.Current.ServiceSecurityContext.WindowsIdentity

6) HTTPSを使用するには、 wsHttpBindingでトランスポートレベルのセキュリティを有効にする必要があります。

7)FalseReliable Sessionsは、 WCFセッション用のReliableMessagingの特定の実装です。Reliable Messagingは、信頼性の低いネットワークでのメッセージ配信を保証するために設計されたWS-*標準仕様です。信頼性の高いメッセージングなしでWCFセッションを使用でき、その逆も可能です。セッションは、次の属性を持つサービスコントラクトで有効になります。

[ServiceContract(SessionMode=SessionMode.Required)]
public interface IMyService {
    // ...
}

また、サービスコール間で状態を維持するには、サービスコントラクトの実装で適切なインスタンスモードを明示的に有効にする必要があることにも注意してください。

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class MyService : IMyService {
    // ...
}

WCFには、セキュアセッション信頼性の高いセッションの2種類のセッションがあります。wsHttpBindingnetTcpBindingの両方のデフォルト設定は、セキュアセッションを使用することです。
wsHttpBindingの場合、これは、バインディングのデフォルト設定であるクライアントの資格情報を使用することにより、メッセージレベルのセキュリティで実現されます。代わりにnetTcpBindingの場合、セッションはTCPプロトコルの機能を使用してトランスポートレベルで確立されます。 これは、wsHttpBindingまたはnetTcpBindingに切り替えるだけで、WCFセッションのサポートが有効になることを意味します。別の方法は、信頼できるセッション を使用することです


。これは、バインディング構成で明示的に有効にする必要があり、wsHttpBindingにメッセージ・セキュリティーを使用する必要がなくなります。したがって、これは機能します:

<bindings> 
    <wshttpbinding> 
        <binding name="ReliableSessionEnabled"> 
            <reliablesession enabled="True" ordered="False" /> 
            <security mode="None" /> 
        </binding> 
    </wshttpbinding> 
</bindings>

8)False、信頼できるセッションは、通信チャネルのセキュリティ設定とは関係なく使用されます。

より詳細な説明については、この記事をご覧ください。

于 2009-01-13T22:28:20.737 に答える
2

Following through on Enrico's excellent answer, these are the configs I am using:

Service:

<services>
    <service name="Foo.Bar.Service">
        <endpoint name="EndpointHttps"
            address=""
            binding="customBinding" bindingConfiguration="EndpointHttps"
            contract="Foo.Bar.IService" />
    </service>
</services>
<bindings>
    <customBinding>
        <binding name="EndpointHttps">
            <reliableSession />
            <mtomMessageEncoding />
            <httpsTransport />
        </binding>
    </customBinding>
</bindings>

Client:

<client>
    <endpoint name="EndpointHttps"
        address="https://server/FooBar/service.svc"
        binding="customBinding" bindingConfiguration="EndpointHttps"
        contract="Foo.Bar.IService" />
</client>
<bindings>
    <customBinding>
        <binding name="EndpointHttps">
            <reliableSession />
            <mtomMessageEncoding />
            <httpsTransport />
        </binding>
    </customBinding>
</bindings>

Note: still haven't gotten this to work with Windows authentication though.

于 2009-02-25T09:17:40.970 に答える