Wie zu aktivieren-Session mit SSL wsHttpBinding im WCF
Habe ich einen WCF-Dienst mit wsHttpBindings und SSL aktiviert, aber ich möchte die aktivieren von WCF-Sitzungen.
Nach dem Wechsel SessionMode erforderlich
SessionMode:=SessionMode.Required
ich bin immer Fehler unten beschrieben.
Vertrag Bedarf der Sitzung, aber Verbindlich "WSHttpBinding" nicht unterstützen
oder ist nicht ordnungsgemäß konfiguriert, um es zu unterstützen.
Hier ist mein Beispiel-Anwendung.
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<!-- When deploying the service library project, the content of the config file must be added to the host's
app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<client />
<bindings>
<wsHttpBinding>
<binding name="NewBinding0" useDefaultWebProxy="false" allowCookies="true">
<readerQuotas maxStringContentLength="10240" />
<!--reliableSession enabled="true" /-->
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" >
<extendedProtectionPolicy policyEnforcement="Never" />
</transport >
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="WcfServiceLib.TestService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="NewBinding0"
contract="WcfServiceLib.ITestService">
<identity>
<servicePrincipalName value="Local Network" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="https://test/TestService.svc" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpsGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
ITestService.vb
<ServiceContract(SessionMode:=SessionMode.Required)>
Public Interface ITestService
<OperationContract(IsInitiating:=True, IsTerminating:=False)> _
Function GetData(ByVal value As Integer) As String
End Interface
TestService.vb
<ServiceBehavior(InstanceContextMode:=InstanceContextMode.PerSession, _
ReleaseServiceInstanceOnTransactionComplete:=False, _
ConcurrencyMode:=ConcurrencyMode.Single)>
Public Class TestService
Implements ITestService
Private _user As User
<OperationBehavior(TransactionScopeRequired:=True)>
Public Function GetData(ByVal value As Integer) As String _
Implements ITestService.GetData
If _user Is Nothing Then
_user = New User()
_user.userName = "User_" & value
_user.userPassword = "Pass_" & value
Return String.Format("You've entered: {0} , Username = {1} , Password = {2} ", _
value, _user.userName, _user.userPassword)
Else
Return String.Format("Username = {1} , Password = {2} ", _
_user.userName, _user.userPassword)
End If
End Function
End Class
Habe ich versucht alle möglichen Lösungen, die ich finden konnte, aber nichts half.
Einige Ratschläge zu aktivieren zuverlässige Sitzungenaber es funktioniert nicht mit ssl (nur, wenn Sie Ihre benutzerdefinierte Bindung), anderen Ratschläge zu verwenden http statt httpsaber ich würde gerne ermöglichen, Sitzungen mit meinen aktuellen Einstellungen, wenn es möglich ist.
Gibt es irgendeinen Ansatz, dies zu erreichen?
Jede Art von Hilfe ist sehr willkommen.
InformationsquelleAutor der Frage hgulyan | 2012-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen "Sitzungen" mit wsHttpBinding, Sie haben entweder für die Verwendung von reliable messaging, oder die Sicherheits-Sitzungen. (Quelle : aktivieren der WCF-Session mit wsHttpBidning mit Transport nur Sicherheit).
WSHttpBinding unterstützt session-aber nur, wenn entweder die Sicherheit (SecureConversation) oder reliable messaging aktiviert ist.
Wenn Sie mit Sicherheit bei transport, dann ist es nicht durch die Verwendung von WS-SecureConversation und WS-ReliableMessaging ist standardmäßig deaktiviert. Daher sind die beiden Protokolle, die WSHttpBinding verwendet für die session nicht zur Verfügung stehen. Sie müssen entweder verwenden die message-Sicherheit oder schalten zuverlässigen Sitzung. (Quelle : http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/57b3453e-e7e8-4875-ba23-3be4fff080ea/).
Wir haben die zurückgewiesen RM über Https in der standard-Bindungen, weil die Art und Weise, um eine RM-Sitzung ist die Verwendung einer Sicherheits-und Https-Sitzung keine Sitzung.
Fand ich die msdn Klappentext über es hier: http://msdn2.microsoft.com/en-us/library/ms733136.aspx
Der Klappentext ist “Die einzige Ausnahme ist, wenn HTTPS verwendet. Die SSL-Sitzung ist nicht dazu verpflichtet, die zuverlässigen Sitzung. Dies stellt eine Bedrohung, weil die Sitzungen teilen sich ein Sicherheitskontext (das SSL-Sitzung) sind nicht voreinander geschützt; diese könnte oder könnte nicht eine Reale Bedrohung, je nach Anwendung."
Aber Sie können es tun, wenn Sie feststellen, es gibt keine Bedrohung. Es ist ein RM über HTTPS Beispiel über benutzerdefinierte Bindung http://msdn2.microsoft.com/en-us/library/ms735116.aspx (Quelle : http://social.msdn.microsoft.com/forums/en-US/wcf/thread/fb4e5e31-e9b0-4c24-856d-1c464bd0039c/).
In der Summe Ihrer Möglichkeiten, können Sie entweder :
1 - Halten wsHttpBinding, entfernen, transport-Sicherheit und ermöglichen eine zuverlässige messaging -
Aber verlieren Sie die SSL-Schicht, und dann ein Teil Ihrer Sicherheit.
2 - Halten "wsHttpBinding" halten-transport-security und add message authentication
Erhalten Sie Ihr SSL-security-layer, aber Ihr Kunde muss sich mit den Anmeldeinformationen (in jeder form) - und sogar, wenn Sie nicht überprüfen Sie Sie auf der service-Seite, fake-müssen noch erbracht werden kann, da WCF lehnen jede Nachricht nicht angeben von Anmeldeinformationen.
3 - Verwenden Sie eine benutzerdefinierte Bindung mit zuverlässigen messaging-und HTTPS-transport
Ich sehe keinen Nachteil dabei, außer die Bedrohung zu erklären, die in MSDN, und es hängt von Ihrer Anwendung.
4 - Verwenden Sie andere session-Anbieter
Wenn Ihre Anwendung ist hotsed in IIS, konnten Sie
abhängig und die
für Ihren Staat.
Oder die Umsetzung Ihrer eigenen cookies.
PS : Beachten Sie, dass für alle diejenigen, die WCF-Konfiguration habe ich nur getestet, service-Aktivierung, nicht aufrufen.
EDIT : Wie pro Benutzer Anfrage
wsHttpBinding
mitTransportWithMessageCredential
Sicherheits-Modus-Durchführung von Sitzungen (ich bin nicht allzu vertraut mit VB.NET also entschuldigen Sie meine syntax) :Service-code-snippet :
service-Konfigurations-snippet :
Client-test-code-snippet :
InformationsquelleAutor der Antwort Paciv
Standardmäßig, WSHttpBinding, erlaubt nur die Sicherheit Sitzungen. Es ist ein Konzept, das von WCF und ist nicht mit dem Transport verbunden. Eine security session ist nicht eine Sitzung über https, sondern eine Sitzung mit der gegenseitigen Authentifizierung. Erreicht wird Sie, indem die message-Sicherheit.
Basierend auf Ihren service, Sie sollten dieses config
Auf), ist hier ein einfaches unit-test -
InformationsquelleAutor der Antwort Cybermaxs
wsHttpBinding erfordert reliableSession zur Unterstützung von WCF-sessions und zuverlässige Sitzungen erfordern benutzerdefinierte Bindung, die ssl unterstützen. So zu Fragen, für WCF-Sitzungen über ssl und mit wsHttpBinding scheint, wie aus der Frage, wie weit ich es sagen kann.
InformationsquelleAutor der Antwort JTMon