Domanda

Ecco il mio piano d'azione: Ho un sito SharePoint sto lavorando su, ed è su un server farm. In questo sito, ho creato un HttpHandler che utilizza una ricerca webservice SharePoint che si trova su un server diverso. In modo che assomigli a questo:

  1. SharePoint Server A, dove le mie vite del sito
    • ha un riferimento di servizio di servizio di ricerca Web di SharePoint Server in B
    • Ha un http gestore che utilizzi il riferimento al servizio per chiamare il servizio di ricerca
  2. SharePoint Server B, in cui vive il servizio di ricerca

I miei sguardi codice come questo:

BasicHttpBinding binding = new BasicHttpBinding();

binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;

QueryServiceSoapClient _queryService = new QueryServiceSoapClient(binding, new EndpointAddress("http://easearch.ea.com/_vti_bin/search.asmx"));
_queryService.ClientCredentials.Windows.AllowNtlm = true;
_queryService.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
_queryService.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
//_queryService.ClientCredentials.Windows.ClientCredential = new NetworkCredential("MyUsername", "MyPassword", "MyDomain"); //This is the only way it seems to work
//NetworkCredential userCredential = CredentialCache.DefaultCredentials.GetCredential(_queryService.Endpoint.ListenUri, "NTLM");
//_queryService.ClientCredentials.Windows.ClientCredential = userCredential;

string status = _queryService.Status();

Se io uso questo codice da un'applicazione console sulla mia casella di dev, esso funziona come previsto. Ma quando cerco di utilizzare lo stesso codice dal mio gestore HTTP, dà l'errore

La richiesta HTTP non è autorizzato con cliente schema di autenticazione 'Ntlm'. L'intestazione di autenticazione ricevuta dal server è stato 'NTLM'.

Ho provato un certo numero di diverse combinazioni di codice di cui sopra e l'unico che funziona dal mio HttpHandler è quando fornisco direttamente le mie credenziali. Qualcuno ha qualche idea?

Grazie.

È stato utile?

Soluzione

Si è verificato il NTLM doppia hop problema qui. Autenticazione NTLM / Windows può passare solo le credenziali da una macchina all'altra, ma non oltre.

La soluzione migliore è quella di implementare Kerberos nel proprio ambiente. Ciò risolverà tutti questi problemi (e dovrebbe sempre essere configurato prima di distribuire SharePoint IMHO). Allora dovrai HttpClientCredentialType insieme a Windows invece di Ntlm.

L'unica altra opzione è quella di specificare le credenziali - sia in modo esplicito come siete o elevando i permessi come Muhimbi descrivere .

Altri suggerimenti

Da quale contesto di sicurezza è il codice viene richiamato? Se si sta elevando il privilegi del codice chiamante poi verranno utilizzate le credenziali del pool di applicazioni client. Questo utente avrà bisogno di avere dei privilegi sul servizio di ricerca web al 2 ° della fattoria.

Ecco qualche utilità I Codice per gli scenari simili. C'è un involucro intorno ad esso (non incluso sotto) che eleva i privilegi per l'identità del pool di applicazione è in esecuzione.

BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

// ** We need to specify an identity (any identity) in order to get it past .net3.5 sp1
EndpointIdentity epi = EndpointIdentity.CreateUpnIdentity("unknown");
EndpointAddress epa = new EndpointAddress(new Uri(address),epi);

client = new DocumentConverterServiceClient(binding, epa);

client.Open();

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top