Tutti,non valido o scaduto token di contesto di sicurezza nel servizio Web WCF
Ho un servizio WCF web (diamo servizio chiamato "B") ospitato in IIS utilizzando un account di servizio (VM, Windows 2003 SP2). Il servizio espone un endpoint che utilizza WSHttpBinding con i valori predefiniti tranne per maxReceivedMessageSize, maxBufferPoolSize, maxBufferSize e alcuni dei timeout che sono stati aumentati.
Il servizio Web è stato sottoposto a test di carico utilizzando il framework di prova del carico di Visual Studio con circa 800 utenti simultanei e ha superato tutti i test senza eccezioni. Il proxy nel test di unità è stato creato dalla configurazione.
Esiste un'applicazione di condivisione che utilizza il servizio di ricerca di Office Sharepoint Server per chiamare i servizi Web "A" e "B". L'applicazione riceverà i dati dal servizio "A" per creare una richiesta che verrà inviata al servizio "B". La risposta proveniente dal servizio "B" è indicizzata per la ricerca. Il proxy viene creato a livello di programmazione utilizzando ChannelFactory.
Quando il servizio "A" richiede meno di 10 minuti, le chiamate al servizio "B" hanno esito positivo. Ma quando il servizio "A" richiede più tempo (~ 20 minuti) le chiamate al servizio "B" generano la seguente eccezione:
Messaggio di eccezione: un errore non protetto o errato è stato ricevuto dall'altra parte. Vedere la FaultException interna per il codice di errore e il dettaglio Messaggio di eccezione interna: il messaggio non può essere elaborato. Ciò è probabilmente dovuto al fatto che l'azione 'namespace/OperationName' non è corretta o perché il messaggio contiene un token di contesto di sicurezza non valido o scaduto o perché c'è una mancata corrispondenza tra i binding. Il token del contesto di sicurezza non sarebbe valido se il servizio interrompesse il canale a causa di inattività. Per evitare che il servizio interrompa anticipatamente le sessioni inattive, aumentare il timeout di ricezione sull'associazione dell'endpoint del servizio.
Le impostazioni di associazione sono uguali, l'ora in entrambi server client e server di servizi Web si sincronizzano con il servizio Ora di Windows, stesso fuso orario.
quando guardo il server dove il servizio web "B" è ospitato, posso vedere gli errori seguenti di sicurezza in fase di ingresso:
Fonte: Sicurezza
Categoria: Accesso/fine sessione
ID evento : 537
utente NT AUTHORITY \ SYSTEM
Errore di accesso:
Motivo: Si è verificato un errore durante l'accesso
Tipo di accesso: 3
Processo di accesso: Kerberos
Pacchetto di autenticazione: Kerberos
Codice di stato: 0xC000006D
codice di stato secondario: 0xC0000133
Dopo aver letto alcuni dei blog online, la Sta codice tus significa STATUS_LOGON_FAILURE e il codice del sottostato indica STATUS_TIME_DIFFERENCE_AT_DC. ma ho già controllato entrambi gli orologi server e client e sono sincronizzati.
Ho anche notato che il token di sicurezza sembra essere memorizzato nella cache da qualche parte nel server client perché ha un altro processo che chiama il servizio web "B" utilizzando lo stesso account di servizio e ottiene i dati con successo per la prima volta. Quindi, avvia il processo per aggiornare gli indici del servizio di ricerca del server sharepoint dell'ufficio e non riesce. Quindi, se chiamano di nuovo il primo processo, fallirà anche lui.
Qualcuno ha riscontrato questo tipo di problemi o ha qualche idea?
saluti,
--Damian
Ho smesso di lavorare con Uso della statistica per il servizio. Se devo eliminarlo, chiama il servizio esplicito ((IDispose)) .Dispose(); alla fine –
Il problema con l'istruzione using è che se si ha un'eccezione durante la chiamata, l'istruzione using chiamerà Dispose() sul client, che chiamerà Close() sul canale sottostante. Poiché la connessione è già in errore, verrà generata un'altra eccezione e quindi la prima eccezione non verrà mai visualizzata. – flayn