Comment activer Session avec SSL wsHttpBinding dans WCF
J'ai un Service WCF avec wsHttpBindings et le SSL est activé, mais j'aimerais activer la WCF sessions.
Après un changement de SessionMode requis
SessionMode:=SessionMode.Required
j'obtiens le message d'erreur décrit ci-dessous.
Contrat exige de la Session, mais Contraignant "WSHttpBinding' ne prend pas en charge
il ou n'est pas configuré correctement pour le soutenir.
Voici mon exemple d'application.
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
J'ai essayé toutes les solutions possibles, j'ai pu trouver, mais rien n'y fit.
Quelques conseils pour permettre fiable des séances d'mais il ne fonctionne pas avec ssl (si seulement vous avez votre liaison personnalisée), d'autres conseils pour utiliser http au lieu de httpsmais j'aimerais permettre aux Sessions avec mes configurations actuelles, si c'est possible.
Est-il une approche pour y parvenir?
Toute sorte d'aide est très apprécié.
source d'informationauteur hgulyan
Vous devez vous connecter pour publier un commentaire.
Si vous voulez "sessions" avec wsHttpBinding, vous devez utiliser la messagerie fiable, ou les sessions de sécurité. (source : comment faire pour activer la WCF Session avec wsHttpBidning avec Transport uniquement de la Sécurité).
WSHttpBinding prend en charge, mais uniquement si la sécurité (SecureConversation) ou la messagerie fiable sont activés.
Si vous utilisez de la sécurité des transports, alors il n'est pas à l'aide de WS-SecureConversation et WS-ReliableMessaging est désactivée par défaut. Par conséquent, les deux protocoles de WSHttpBinding utilise pour la session ne sont pas disponibles. Vous devez soit utiliser un message de sécurité ou de tourner sur la fiabilité de session. (source : http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/57b3453e-e7e8-4875-ba23-3be4fff080ea/).
Nous avons refusé RM sur Https dans la norme des liaisons en raison de la façon à assurer un RM session est d'utiliser la sécurité de session et Https ne fournit pas de session.
J'ai trouvé la msdn blurb à ce sujet ici: http://msdn2.microsoft.com/en-us/library/ms733136.aspx
Le texte de présentation est “La seule exception est lorsque vous utilisez le protocole HTTPS. La session SSL n'est pas lié à la fiabilité de session. Cela impose une menace, parce que des séances de partage d'un contexte de sécurité (la session SSL) ne sont pas protégés les uns des autres; ce qui pourrait ou ne pourrait pas être une menace réelle en fonction de l'application.”
Cependant, vous pouvez le faire si vous déterminez il n'y a pas de menace. Il y a un RM sur HTTPS exemple via liaison personnalisée http://msdn2.microsoft.com/en-us/library/ms735116.aspx (source : http://social.msdn.microsoft.com/forums/en-US/wcf/thread/fb4e5e31-e9b0-4c24-856d-1c464bd0039c/).
Pour résumer vos possibilités, vous pouvez soit :
1 - Garder wsHttpBinding, retirez de la sécurité des transports et activer la messagerie fiable
Mais vous perdez la couche SSL et puis une partie de votre sécurité.
2 - Garder wsHttpBinding, garder la sécurité des transports et ajouter l'authentification de message
Vous arrivez à garder votre système de sécurité SSL couche, mais votre client devra fournir les informations d'identification (de toute forme), et même si vous ne validez pas au service d'un côté, les faux doivent encore être fournis à titre de WCF va rejeter tout message ne spécifiant des informations d'identification.
3 - l'Utilisation d'une liaison personnalisée avec la messagerie fiable et HTTPS transport
Je ne vois aucun inconvénient à cela, sauf la menace expliqué dans MSDN, et cela dépend de votre application.
4 - Utiliser les autres fournisseurs de session
Si votre demande est hotsed dans IIS, vous pouvez définir
et dépendent de la
pour votre état.
Ou de mettre en œuvre vos propres cookies.
PS : à Noter que pour tous ceux configuration WCF, j'ai seulement testé l'activation du service, pas d'appels.
EDIT : conformément à la demande de l'utilisateur,
wsHttpBinding
avecTransportWithMessageCredential
le mode de sécurité de la mise en œuvre de sessions (je ne suis pas trop familier avec VB.NET donc, pardon pour mon syntaxe) :Service extrait de code :
service extrait de code de Configuration :
Client de test extrait de code :
Par défaut, WSHttpBinding seulement permet des sessions de sécurité. C'est un concept de la WCF et n'est pas lié au Transport. Une sécurité de session n'est pas une session https, mais une session avec authentification mutuelle. Ce résultat est obtenu par l'ajout d'un message de sécurité.
En fonction de votre service, vous devez appliquer cette config
Sur clientside, ici est un simple test de l'unité
wsHttpBinding nécessite reliableSession à l'appui de la WCF sessions, et fiable des séances d'exiger liaison personnalisée pour prendre en charge ssl. Donc ce genre de questions pour les séances sur ssl et avec wsHttpBinding semble être hors de question pour autant que je peux dire.