Ok, ho impiegato circa 15 ore a provare a risolvere questo problema e sono finalmente stato rassegnato a postare qui per cercare di risolverlo. So che questo post è molto lungo ma ho fatto tutte le normali cose che mi verrà detto di provare, quindi voglio assicurarmi che sia chiaro, quindi non perdiamo tempo a riguardo.SharePoint 2013/IIS 7.5 Impersonation/Delegation/Double Hop
Ho una macchina virtuale Win Server 2008 R2 ospitata su un server ESXi 5.0. Su questo server ho installato l'anteprima di SharePoint Foundation 2013 e tutti i pre-requisiti, ecc. Sto eseguendo tutto da questo server (MSSQL, IIS 7.5, servizi di SharePoint) poiché avremo un utilizzo molto limitato e avremo solo circa 30 utenti. Una cosa che ho disperatamente bisogno di aggiungere a SharePoint è la possibilità per gli utenti di modificare le loro informazioni in Active Directory (Server 2003) poiché il nostro annuncio è poco popolato ed è obsoleto. Ho trovato una WebPart perfetta e funziona meravigliosamente per la modifica degli utenti.
Il problema si presenta quando voglio configurare la WebPart per consentire all'utente di modificare solo se stessi. La WebPart (correttamente) utilizza questa riga di codice in C# .NET :. per ottenere l'identità attualmente connessa che è stata autenticata con l'autenticazione di Windows in IIS. Invece, ciò restituisce l'utente locale NT AUTHORITY/IUSR. (So che questa non è una novità per nessuno).
System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Così ho iniziato la mia ricerca e ha fatto in modo delle seguenti cose.
Nel mio web.config per SharePoint, ho il seguente:
<authentication mode="Windows" />
<identity impersonate="true" />
In IIS, ho le seguenti impostazioni di autenticazione per il sito IIS che ospita l'installazione di SharePoint:
Anonymous Authentication Disabled
ASP.NET Impersonation Enabled
Basic Authentication Disabled HTTP 401 Challenge
Digest Authentication Disabled HTTP 401 Challenge
Forms Authentication Disabled HTTP 302 Login/Redirect
Windows Authentication Enabled HTTP 401 Challenge
Quindi so che il sito sta ancora effettuando l'accesso con l'utente anonimo anche se l'autenticazione anonima è disabilitata. Mi sono imbattuto in informazioni sul problema del doppio salto che corrisponde ai miei problemi e ho trovato questo link e ho seguito tutte le indicazioni in questo post: http://blogs.technet.com/b/taraj/archive/2009/01/29/checklist-for-double-hop-issues-iis-and-sql-server.aspx. Dopo ogni passaggio, ho verificato eventuali cambiamenti nel comportamento dell'applicazione, ma non ne ho mai trovato nessuno.
In sintesi ho fatto la seguente:
- ho creato un account utente di dominio per eseguire il pool di applicazioni. Per il test, ho fatto di questo utente un membro del gruppo Domain Admins.
- Ho modificato una riga in web.config su
<add key="aspnet:AllowAnonymousImpersonation" value="false" />
(era vero). Ciò impediva all'utente NT AUTHORITY \ IUSR di eseguire l'applicazione e invece veniva eseguito con l'account di dominio creato per eseguire il pool di app. Ora potevo accedere a SharePoint e accedere alla mia WebPart, tuttavia, come previsto, mi ha presentato le informazioni di AD per l'utente del dominio che eseguiva il pool di app, piuttosto che l'utente del dominio che si era autenticato. Quindi so che WebPart funziona e ha le autorizzazioni necessarie ecc. MaSystem.Security.Principal.WindowsIdentity.GetCurrent().Name;
sta ancora restituendo l'utente che sta eseguendo il pool di app, ad es.la rappresentazione non funziona ancora - In Utenti e computer AD, ho concesso
Trust this computer for delegation to any service
per il server virtuale su cui viene eseguito tutto questo. - Poiché non disponevo della scheda "Delega" per l'account utente del dominio che eseguiva il pool di app, ho dovuto registrare un SPN per l'utente. Dopo aver registrato tutti gli SPN copiati dall'elenco di SPN del server e anche un paio di SPN http che ho trovato online, e anche l'impostazione di
Trust this user for delegation to any service
sull'utente, non si sono verificati cambiamenti nel comportamento dell'applicazione. - Mi sono assicurato che l'utente del dominio con cui stavo effettuando l'accesso non fosse protetto dalla delega
- Sono entrato nell'editor dei criteri locali sul server SharePoint e mi sono assicurato che l'utente del dominio che eseguiva il pool di app fosse autorizzato a "Agisci come parte del sistema operativo "e" Impersonare un client dopo l'autenticazione ".
- Altre cose che ho provato
- Aggiungi
Negotiate:Kerberos
come un provider di autenticazione per Windows Auth sul sito web IIS - Confermata la presenza di queste due linee in SharePoint web.config:
- Aggiungi
Di seguito sono i miei record SPN sul DC:
setspn -l SPserver
Registered ServicePrincipalNames for CN=SPserver,CN=Computers,DC=DOMAIN,DC=local:
MSSQLSvc/SPserver.DOMAIN.local:appPoolUser
WSMAN/SPserver
WSMAN/SPserver.DOMAIN.local
TERMSRV/SPserver
TERMSRV/SPserver.DOMAIN.local
RestrictedKrbHost/SPserver
HOST/SPserver
RestrictedKrbHost/SPserver.DOMAIN.local
HOST/SPserver.DOMAIN.local
setspn -l appPoolUser
Registered ServicePrincipalNames for CN=appPoolUser,OU=Utility,OU=Users,OU=Company Name,DC=DOMAIN,DC=local:
http/subdomain.domain.com
http/SPserver.DOMAIN.local
RestrictedKrbHost/appPoolUser.DOMAIN.local
RestrictedKrbHost/appPoolUser
MSSQLSvc/appPoolUser.DOMAIN.local:appPoolUser
HOST/appPoolUser
HOST/appPoolUser.DOMAIN.local
Ho riavviato il server e IIS diverse volte durante questo processo. Ancora quando accedo, la mia web part mi identifica come utente che esegue il pool di applicazioni. So che ci sono dei problemi come usare un pool di app in modalità Classic ma che è deprecato. Ci sono altri modi per ottenere il nome corretto in .NET, ma non voglio dover cambiare la web part e, cosa più importante, questo è il modo corretto per farlo e dovrei riuscire a farlo funzionare. Non voglio dover continuamente aggirarlo.
Se qualcuno ha altre idee su cosa potrebbe causare il problema, mi piacerebbe ascoltarle.
Volevo solo aggiornare questo post. Non ho ancora trovato una risoluzione e non sembra che qualcosa abbia suonato un campanello per chiunque altro. Nel frattempo, ho modificato il codice nella web part per ottenere all'utente in questo modo: 'Sito SPSite = nuovo SPSite (SPContext.Current.Web.Url.ToString());' 'SPWeb web = sito .OpenWeb ("/"); ' ' Utente SPUser = web.CurrentUser; ' – user456151