Il modello dell'oggetto client dà 401 quando impersonare l'applicazione dell'utente dell'Utente - MVC

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/38137

  •  09-12-2019
  •  | 
  •  

Domanda

Ho un'applicazione MVC ASP.NET che si connette a SharePoint 2010 tramite il client OM. Quando eseguo ExecuteQuery(), ricevo un errore HTTP 401 da SharePoint.

Ho l'app MVC impostata per impersonare l'utente registrato.

L'impostazione Impersonate in Web.Config (dell'app MVC):

<configuration>
    <system.web>
        <identity impersonate="true" />
    </system.web>
</configuration>
.

Il codice:

Client Context ctx = new ClientContext("http://sharepoint.company.com/site");
ctx.Credentials = CredentialCache.DefaultNetworkCredentials;

Web web = ctx.Web;
ListCollection lists = web.Lists;

ctx.Load(web);
ctx.Load(lists);

ctx.ExecuteQuery();
.

L'eccezione:

.

system.net.webxception: il server remoto ha restituito un errore: (401) non autorizzato. a System.net.httpwebrequest.getresponse () A Microsoft.SharePoint.client.spwebrequestestexecutor.execute () A Microsoft.SharePoint.Client.ClientContext.ensureformdigest () A Microsoft.SharePoint.Client.clientContext.executeQuery () su mvcapp.services.sharepointservice.getLibrary ()

Quando rimuovo l'impostazione di Impersonation da Web.Config, il client OM utilizza l'account APP dell'app dell'app MVC per connettersi. Quando ciò accade, la connessione ha esito positivo (dopo aver garantito le autorizzazioni dell'account APP Pool Account). Inoltre, se ho il codice rigido una credenziale dell'utente invece di utilizzare DefaultNetworkCredentials, anche la connessione funziona.

L'app è configurata per l'autenticazione di Windows e l'autenticazione anonima è disabilitata in IIS.

Cose che abbiamo provato:

    .
  1. Assicurarsi che gli account APP Pool siano in grado di delegare le autorizzazioni.
  2. Configurazione Verified Kerberos (abbiamo rimosso alcuni SPNS duplicati)
  3. Connetti da un server diverso (stiamo ospitando questa app sul server App SharePoint). Connessione da questo server significa che non possiamo connetterci a qualsiasi istanza di SharePoint. Connessione da un altro server ci consente di connettersi al nostro ambiente Dev, ma non a questo server (QA) o dal nostro ambiente di produzione.

    Cosa posso fare per ottenere il client om per delegare le autorizzazioni dell'utente quando si collega a SharePoint?


    .

    Aggiornamento

    È interessante notare che ho provato un semplice webquest per SharePoint, con risultati identici, che mi dice che il problema non è causato dal Cliente OM:

    WebRequest request = WebRequest.Create("http://xxxxxxxxx");
    request.Credentials = CredentialCache.DefaultNetworkCredentials;
    
    using(WebResponse response = request.GetResponse())
    using(StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        return Content(reader.ReadToEnd(), "text/html");
    }
    
    .

È stato utile?

Soluzione

Questo suona molto come stai colpendo il notorious NTLM doppio problema hop e mi dispiace dire che non c'è modo di aggirarlo da parte di modificare la tua autenticazione a reclami o Kerberos.Nessuno dei due dovrebbe essere preso alla leggera.

Se il tuo codice viene eseguito su una delle macchine nell'azienda agricola SharePoint che stai tentando di interagire, quindi puoi probabilmente aggirare questo saltando il secondo 'hop' del tutto e interagibile con SharePoint direttamente tramite il modello dell'oggetto sul modelloServer anziché tramite servizi Web.

Altri suggerimenti

Sono passati quasi due anni ma recentemente ho avuto lo stesso problema con SharePoint 2013 (ho effettivamente acceduto SP2013 con le librerie CSom SP 2010). Finalmente sono riuscito a risolverlo.

In primo luogo, presumo che l'autenticazione Kerberos funzioni correttamente nel tuo caso. Solo per essere al sicuro, puoi disattivare l'autenticazione NTML in Impostazioni IIS o visualizzare sulla pagina di prova

Thread.CurrentPrincipal.Identity.AuthenticationType
.

dovrebbe essere negoziare . Non è possibile puntare la delegazione quando effettivamente accedi con NTML, che può accadere quando si è consentiti entrambi.

Avanti, l'aggiornamento alla tua domanda. Mi ha aiutato molto, mi sono reso conto che non dovremmo preoccuparci di csom quando la delegazione più semplice con Webrequest non funziona. Il problema è qui.

E infine, questo collegamento poco appariscente dalla risposta s j può effettivamente fornire la soluzione - hai menzionato tutti i passaggi nella configurazione della delegazione tranne che consentendo la delega per il server . Sì, è necessario configurare che ti fidi di sia l'account per la delegazione (che hai menzionato) e questa macchina specifica per la delegazione.

E un'altra cosa abbastanza ovvia: la stessa SharePoint deve essere configurata correttamente per l'autenticazione Kerberos.

Una volta che la delega per una richiesta Web funziona (ad esempio il caricamento della pagina iniziale), è possibile fare lo stesso con CSOM. L'ho testato, funziona come un fascino.

La differenza è che ho (1) usato SP2013 con il CSOM 2010, (2) attivato la delega solo per un frammento specifico piuttosto che per l'intera richiesta:

string ImpersonatedSpLogin = null, ImpersonatedSpMail = null;

WindowsIdentity identity = (WindowsIdentity)User.Identity;
using (var impersonationContext = identity.Impersonate())
{
    using (ClientContext context = new ClientContext("http://myServer.somewhere.com/"))
    {
        context.Load(context.Web.CurrentUser);
        context.ExecuteQuery();
        ImpersonatedSpLogin = context.Web.CurrentUser.LoginName;
        ImpersonatedSpMail = context.Web.CurrentUser.Email;
    }

    impersonationContext.Undo();
}
// now you can verify by checking  ImpersonatedSpLogin and ImpersonatedSpMail
.

Spero che aiuta qualcuno.

hai <authentication mode="Windows" /> lì da qualche parte anche?Credo che sia anche richiesto.

Il link sottostante ha alcune informazioni sull'output di alcune variabili in base alle impostazioni di configurazione del Web.Config e IIS

https://stackoverflow.com/a/1688220/1282079

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