Devo chiamare un servizio WCF a livello di programmazione. Il servizio può essere ospitato con l'autenticazione o NTLM o Kerberos e deve funzionare in entrambi. Cioè, se la connessione al servizio via Kerberos fallisce, allora dovrebbe tornare a NTLM.Come scrivere codice che chiama un servizio WCF e se necessario torna da Kerberos a NTLM?
Ecco il codice che sto utilizzando per Kerberos autenticazione (se del caso, il servizio è ospitato in SharePoint 2010 e viene chiamato da una parte web):
public static SiteMembershipSvc.SiteMembershipServiceClient InitialiseSiteMembershipService(string url)
{
var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
url = url.EndsWith("/") ? url + SiteMembershipAddress : url + "/" + SiteMembershipAddress;
var endpoint = new EndpointAddress(url);
var proxy = new SiteMembershipSvc.SiteMembershipServiceClient(binding, endpoint);
proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
return proxy;
}
Chiamare un metodo sul proxy quando corsa in un ambiente NTLM dà l'errore:
The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'NTLM'.
Nota: l'URL può essere in un'altra applicazione web su un altro server. Non riesco a verificare quale autenticazione esegue l'app web della web part e ritengo che sia la stessa di dove è ospitato il servizio WCF.
Come è possibile (automaticamente o manualmente) garantire che l'autenticazione ricada indietro da Kerberos a NTLM in caso di errore?
Aggiornamento:
Come detto, l'errore di autenticazione si verifica quando un metodo Web viene chiamato. Tuttavia, non voglio aspettare così a lungo che ci sono diversi metodi web nel servizio chiamato da più posti. Mi piacerebbe testare l'autenticazione nel punto in cui è configurato il proxy (nello snippet di codice sopra).
Ho provato a utilizzare proxy.Open()
ma ciò non sembra causare l'errore.
Beh, è più che voglio provare prima Kerberos e se fallisce, usa NTLM. Speravo che l'utilizzo dell'autent Kerberos lo avrebbe fatto automaticamente ma non sembra. –
Anche la mia prima ipotesi. Il modo di pensarci è se ogni servizio in azienda fosse affidabile, quindi si potrebbe avere un servizio non autorizzato per rubare credenziali, impersonare e fare cose cattive. L'SPN obbliga l'amministratore aziendale a dire che questo servizio è affidabile per avere le credenziali Kerberos, altrimenti non chiederglielo. – Spence
Buono a sapersi. Ho riformulato la domanda un po 'perché non penso fosse abbastanza chiaro. Ho bisogno che la web part "selezioni automaticamente" l'autenticazione corretta a seconda che il servizio sia ospitato in Kerberos o Windows auth. –