2014-04-03 28 views
7

Ho cercato di estrarre alcuni dati di elenco di SharePoint 2013 che ho creato e che funzionano correttamente quando si esegue localmente sul mio computer e quando si esegue localmente un server. Sono utente le stesse credenziali quando si esegue sia localmente che localmente sul server. Il problema è quando pubblico e navigo verso la mia app ASP.NET sul server. Ricevo "Il server remoto ha restituito un errore: (401) Non autorizzato". Errore ...Il server remoto ha restituito un errore: (401) Non autorizzato. Utilizzo di CSOM in ASP.NET

Ho guardato un mucchio dei messaggi su StackOverflow e di alcuni altri articoli sul web

Questo indica che il contesto sembra utilizzare IUSR: http://blogs.msdn.com/b/sridhara/archive/2014/02/06/sharepoint-2013-csom-call-from-web-part-fails-with-401-for-all-users.aspx

Questo si parla di per provare a impostare le credenziali di rete di default: https://sharepoint.stackexchange.com/questions/10364/http-401-unauthorized-using-the-managed-client-object-model

ho provato con le correzioni di cui l'articolo così come il tentativo di forzare il contesto da usare DefaultNetworkCredentials ma senza fortuna. Vorrei per l'applicazione per utilizzare le credenziali utente connesso e non la macchina ...

Ecco il codice che sto utilizzando:

 SP.ClientContext context = new SP.ClientContext("MySPDevInstance"); 
     context.Credentials = CredentialCache.DefaultNetworkCredentials; 

     Entity entity = context.Web.GetEntity(collectionNamespace, collectionName); 
     LobSystem lobSystem = entity.GetLobSystem(); 
     LobSystemInstanceCollection lobSystemInstanceCollection = lobSystem.GetLobSystemInstances(); 

     context.Load(lobSystemInstanceCollection); 
     context.ExecuteQuery(); 

     LobSystemInstance lobSystemInstance = lobSystemInstanceCollection[0]; 
     FilterCollection filterCollection = entity.GetFilters(filter); 

     filterCollection.SetFilterValue("LimitFilter", 0, 1000); 

     EntityInstanceCollection items = entity.FindFiltered(filterCollection, filter, lobSystemInstance); 

Il server esegue IIS 6.0

Qualche consiglio sarebbe molto apprezzato!

Grazie

+0

Sai come ottenere tutte le entità dalla LOB senza applicare un filtro? http://sharepoint.stackexchange.com/questions/97155/sharepoint-2013-bcs-external-data-column – monkeyjumps

risposta

4

Presumo che il sito Web ASP.NET utilizzi l'autenticazione Windows Integrated (NTLM). Un utente autenticato in questo modo non può eseguire l'autenticazione in una seconda posizione dal lato server (il server Web). Si sta verificando la cosiddetta limitazione "doppio hop" (1) di NTLM. È necessario utilizzare un account dedicato sul lato server oppure, se si desidera realmente utilizzare l'identità dell'utente connesso, è necessario utilizzare uno schema di autenticazione che consenta la delega, ad esempio Kerberos.

Se è davvero necessaria l'identità dell'utente per accedere ai dati di SharePoint e non è possibile modificare lo schema di autenticazione, il modo migliore per farlo è utilizzare la CSOM JavaScript. Ciò significa che l'utente si sta autenticando direttamente sul server SharePoint (un singolo hop, non doppio) e il tuo sito ASP.NET serve la pagina che contiene questo script all'utente.

(1) http://blogs.msdn.com/b/knowledgecast/archive/2007/01/31/the-double-hop-problem.aspx

+1

Grazie per la risposta! Quindi, se imposto Kerberos e SharePoint Server e Web Server si fidano l'un l'altro se il mio codice sopra funziona? – Hidan

+1

Sì, questa è l'idea @Hidan – x0n

+0

Ok, finalmente ci siamo rimessi. Ho installato il kerberos ma ora sto ottenendo l'errore "Il nome principale dell'obiettivo non è corretto". Ho provato a cercare in giro per vedere cosa significa in relazione alle tecnologie con cui sto lavorando, ma non ho avuto successo ... Qualche idea? – Hidan

3

Setup i crendentials per codice:

SP.ClientContext context = new SP.ClientContext("MySPDevInstance"); 
context.Credentials = new NetworkCredential("username", "password"); 

Si dovrebbe mettere questo al file di configurazione di cambiarla senza pubblicare o ricompilare l'applicazione.

+0

Non riesco a codificare le credenziali, ho bisogno di usare l'autenticazione di Windows. L'utente avrà una configurazione dell'account sharepoint. – Hidan

+0

Quindi è necessario ottenere le credenziali utente registrate e passarle a NetWorkCredential – Fals

+0

@fals Le credenziali dell'utente connesso non sono disponibili quando si utilizza uno schema di autenticazione challenge-response come Windows integrato (NTLM) – x0n

4

Usa credenziali predefinite lavorato per me:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
httpWebRequest.UseDefaultCredentials = true; 
0

solo per aggiungere un ambiente più che ho incontrato. Se l'account è limitato all'accesso solo a determinati server piuttosto che aggiungere la macchina client a tale account. Ad esempio, se un'applicazione Web è ospitata sul server A e si sta tentando di connettersi a SharePoint 2010 sul server B con l'account ABC, accertarsi che l'account abbia accesso al server A in Active Directory. Normalmente l'account AD non ha restrizioni per connettersi alle macchine, ma nel mio caso l'account era limitato solo a determinati computer. Ho aggiunto il mio server host dell'applicazione Web all'account e ha funzionato.