[.NET] WCF, MessageSecurityException

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo .NET devvers,

De volgende sitatie:
Services op development PC
+ Clients op development PC
=> Alles werkt prima.

Na het deployen van de services in een VM (inc certificaat)
+ Clients op development PC
=> MessageSecurityException is thrown

Ik loop dan dus tegen de volgende exception aan:
"An unsecured or incorrectly secured fault was received from the other party."
Met inner exception: {"Er is een fout opgetreden bij het controleren van de beveiliging voor het bericht."}

Edit, at random wordt deze ook wel eens gegooid:
The request channel timed out while waiting for a reply after 00:00:05.3083000. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.

De service is als volgt geconfigureerd:


Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
            Dim
 oBinding As
 New
 WSHttpBinding()
            With
 oBinding
                .Security.Mode = SecurityMode.Message
                .Security.Message.ClientCredentialType = MessageCredentialType.UserName
                .ReliableSession.Enabled = True

                .ReliableSession.Ordered = True

                .MessageEncoding = WSMessageEncoding.Text
            End
 With


            With
 oHost.Credentials
                .UserNameAuthentication.UserNamePasswordValidationMode = _
                    ServiceModel.Security.UserNamePasswordValidationMode.Custom
                .UserNameAuthentication.CustomUserNamePasswordValidator = New
 Authenticator()
                .ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                        StoreName.My
, X509FindType.FindBySubjectName, _
                                                        _sCertName)
            End
 With


De client is als volgt geconfigureerd:


Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        Dim
 oService As
 New
 ServiceClient()
        oService.Endpoint.Address = New
 EndpointAddress( _
           New
 Uri(String
.Format("...address..."
, _
           sIpAddress, sPort)), EndpointIdentity.CreateDnsIdentity(Settings.DnsIdentity))
        With
 oService.ClientCredentials
            .UserName.UserName = sUsername
            .UserName.Password = sPassword
            .ServiceCertificate.Authentication.CertificateValidationMode = _
                ServiceModel.Security.X509CertificateValidationMode.Custom
            .ServiceCertificate.Authentication.CustomCertificateValidator = New
 CertValidator()
        End
 With

        Dim
 oWsBinding As
 WSHttpBinding = oService.Endpoint.Binding
        oWsBinding.ReliableSession.Enabled = True

        oWsBinding.ReliableSession.Ordered = True


Edit: wat trace erbij;
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   bij System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout)
   bij System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout)
   bij System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation(SecuritySessionOperation operation, EndpointAddress target, Uri via, SecurityToken currentToken, TimeSpan timeout)
   bij System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore(TimeSpan timeout)
   bij System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(TimeSpan timeout)
   bij System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnOpen(TimeSpan timeout)
   bij System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   bij System.ServiceModel.Channels.ReliableChannelBinder`1.ChannelSynchronizer.SyncWaiter.TryGetChannel()
   bij System.ServiceModel.Channels.ReliableChannelBinder`1.ChannelSynchronizer.SyncWaiter.TryWait(TChannel& channel)
   bij System.ServiceModel.Channels.ReliableChannelBinder`1.ChannelSynchronizer.TryGetChannel(Boolean canGetChannel, Boolean canCauseFault, TimeSpan timeout, MaskingMode maskingMode, TChannel& channel)
   bij System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout, MaskingMode maskingMode)
   bij System.ServiceModel.Channels.RequestReliableRequestor.OnRequest(Message request, TimeSpan timeout, Boolean last)
   bij System.ServiceModel.Channels.ReliableRequestor.Request(TimeSpan timeout)
   bij System.ServiceModel.Channels.ClientReliableSession.Open(TimeSpan timeout)
   bij System.ServiceModel.Channels.ReliableRequestSessionChannel.OnOpen(TimeSpan timeout)
   bij System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   bij System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
   bij System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   bij System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)
   bij System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
   bij System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)
   bij System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   bij System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   bij System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   bij System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)


Ik gebruik dus custom UsernamePassword en Certificate validators.
Wat er gebeurt:
- Eerste call wordt gemaakt
- Certificaat wordt gevalideerd
- Timeout periode verloopt
- Exception

Voor de duidelijkheid
- Proxies zijn actueel
- De systeem tijden lopen gelijk
- In development only omgeving werkt het wel

Waar gaat het mis?

[ Voor 37% gewijzigd door Verwijderd op 04-06-2009 15:09 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Wat is de waarde van Settings.DnsIdentity die je als identity op het endpoint zet voor de proxy? Als het 'localhost' is heb je daar misschien een reden van je exception.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De DnsIdentity is OK. Als die niet juist is krijg je een explicitie exception (toevallig een keer meegemaakt).

Acties:
  • 0 Henk 'm!

Verwijderd

Heb je WCF tracing en message logging al aangezet? Daar kun je een heleboel informatie uithalen. Staat daar iets bijzonders in?

edit: heeft het account waar je service onder draait genoeg rechten om het certificaat uit te lezen (toegang tot de private key)? Is er op de client een geldig certification path voor je server certificaat? Staat je certificaat in de goede store? (Het zijn maar suggesties, maar misschien dat je iets over het hoofd gezien hebt).

[ Voor 48% gewijzigd door Verwijderd op 05-06-2009 09:07 . Reden: Bedacht me nog iets... ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Er was inderdaad een certificaat probleem, dat zag ik pas toen ik ging debuggen omdat ook een fout zat in mijn exception/logging code op die plek (die fouten komen nooit alleen). Ik had geen VS geinstalleerd op mijn testserver image en de fout werd niet gelogged. Het certificaat op mijn dev apparaat was wel goed dus daar ging het prima.

DUSSS als je een MessageSecurityException krijgt ZONDER InnerException => dubbelcheck je UserNamePasswordValidator.