2009-01-09 26 views
8

Nie mogę dowiedzieć się, jak włączyć wystąpienia dla każdej sesji dla mojej usługi WCF podczas korzystania z HTTPS. (Nie jestem ekspertem ASP.NET, ale nie chcę używać stanu sesji ASP.NET, jeśli to możliwe.) Używam .NET Framework 3.0.Sesje WCF z HTTPS

Doszedłem do następującej sprzeczności i mam nadzieję, że ktoś może mi powiedzieć, gdzie jest błąd w logice.

1) Usługa musi być obsługiwana w IIS 6 ze względu na mandat klienta.

2) Usługa musi utrzymywać stan między połączeniami, w tym wystąpienia SqlConnection i SqlTransaction (brzydkie, ale konieczne ze względu na ograniczenia projektu).

3) Dlatego potrzebuję użyć wsHttpBinding.

4) Usługa musi mieć możliwość uzyskania dostępu do informacji uwierzytelniających użytkownika z HttpContext.Current.User.Identity (np. Z wykorzystaniem zabezpieczeń systemu Windows w IIS).

5) W związku z tym wymagany jest protokół HTTPS.

6) Zabezpieczenia na poziomie transportu muszą być skonfigurowane na wiązaniu.

7) Skonfigurowanie usługi wymagającej sesji oznacza, że ​​muszę skonfigurować wsHttpBinding, aby korzystać z Reliable Sessions.

8) Wymaga to skonfigurowania zabezpieczeń na poziomie komunikatu dla powiązania.

tj. (6) i (8) wzajemnie się wykluczają.

Wygląda na to, że korzystanie z sesji WCF wymaga użycia zabezpieczeń na poziomie wiadomości, co uniemożliwia mi korzystanie z HTTPS.

Czego mi brakuje?

+0

Czy podczas tej konfiguracji występują konkretne błędy lub czy sprawdzasz, czy taka konfiguracja jest możliwa? –

+0

Chciałbym wiedzieć, czy konfiguracja jest możliwa: np. Sesje WCF z HTTPS. Dzięki. –

Odpowiedz

15

3) prawda, wsHttpBinding i wsDualHttpBinding są jedynymi Wiązania HTTP, które obsługują sesje

5) fałszywych, w celu uwierzytelnienia dzwoniących usługa nie koniecznie musisz mieć wszelkie zabezpieczenia na poziomie transportu (takie jak SSL/HTTPS). Jedynym wymaganiem jest skonfigurowanie usług IIS w celu włączenia Integrated Windows Authentication dla katalogu wirtualnego. Następnie w WCF masz trzy możliwości, aby umożliwić ten scenariusz:

a) korzystają z zabezpieczeń na poziomie transportu na wsHttpBinding z poświadczeń systemu Windows (HTTPS)

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

b) Za bezpieczeństwo wiadomość szczebla na wsHttpBinding z okna poświadczenia (HTTP)

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

c) Uruchom usługę pod ASP.NET trybie kompatybilności i umożliwienie Windows Authentication w ŻMIJA.NET (HTTP)

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

Należy zauważyć, że w i b będzie dostęp tożsamości rozmówcy z poziomu usług w ten sposób:

OperationContext.Current.ServiceSecurityContext.WindowsIdentity 

6) prawda, transport Zabezpieczenia na poziomie muszą być włączone na wsHttpBinding w celu użycia HTTPS

7) Fałsz, Niezawodne sesje to szczególna realizacja Niezawodne przesyłanie wiadomości dla sesji WCF. Niezawodne przesyłanie wiadomości jest standardową specyfikacją WS- *, zaprojektowaną w celu zagwarantowania dostarczania wiadomości w niewiarygodnej sieci. Możesz używać sesji WCF bez niezawodnego przesyłania komunikatów i viceversa. Sesje są włączone na umowy o świadczenie usług z tego atrybutu:

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

Należy również pamiętać, że w celu utrzymania stanu pomiędzy usługą połączenia będą jawnie trzeba włączyć odpowiedni tryb instancji w sprawie realizacji zamówienia usługę:

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

Istnieją dwa rodzaje sesji w WCF: Bezpieczne sesje i Niezawodne sesje. Domyślnym ustawieniem dla wsHttpBinding i netTcpBinding jest użycie Secure Sessions.
Dla wsHttpBinding jest to realizowane za pomocą poziomu zabezpieczeń na poziomie wiadomości przy użyciu poświadczeń klienta, co jest domyślnym ustawieniem dla wiązania .
Zamiast polecenia netTcPBinding sesja zostaje ustanowiona na na poziomie tranportowym przy użyciu funkcji protokołu TCP.
Oznacza to, że po prostu przełączenie na wsHttpBinding lub netTcpBinding umożliwi obsługę sesji WCF.
Alternatywą jest użycie Niezawodne sesje. Musi to być jawnie włączone w konfiguracji powiązania i usuwa wymóg stosowania zabezpieczeń wiadomości dla wsHttpBinding. Więc to będzie działać:

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

8) Fałsz, niezawodny Sesje są stosowane niezależnie od ustawień zabezpieczeń kanału komunikacyjnego.

Bardziej szczegółowe wyjaśnienie można znaleźć na stronie this article.

+0

Dzięki za szczegółową odpowiedź. Jedno pytanie: w (7) mówisz, że sesje są włączone przez ustawienie właściwości SessionMode. Nie uznałem tego za prawdę: bez umożliwienia niezawodnych sesji otrzymałem "wiązanie nie skonfigurowane do obsługi sesji" lub coś w tym stylu. Być może teraz będzie inaczej. –

+0

Zaktualizowałem wpis, podając więcej informacji o sesjach WCF. Być może używasz innego wiązania, a może wyraźnie zablokowałeś zabezpieczenia? –

+0

Oto przydatny artykuł: http://www.lybecker.com/blog/2007/04/30/wcf-sessions-and-reliable-messaging/ –

2

po drodze na doskonałą odpowiedź Enrico, są configs używam:

Usługa:

<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> 

Klient:

<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> 

Uwaga: nadal nie dostał tego, aby działa jednak z uwierzytelnianiem Windows.

+0

Na czym polega problem? –