2009-09-10 21 views
19

Possiedo un'applicazione Web MVC su una rete Intranet e voglio poter creare file sul nostro server FTP da inviare a partner esterni.Rappresentazione in ASP.NET MVC

Il codice per la rappresentazione utilizza WindowsImpersonationContext.

System.Security.Principal.WindowsImpersonationContext impersonationContext; 
impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate(); 

StreamWriter sw = System.IO.File.CreateText("PathOnFTPServer"); 
sw.Write("data"); 

impersonationContext.Undo(); 

Ecco cosa sta succedendo e il motivo della mia domanda:

Pre rappresentazione

User.Identity.Name: [Il mio Windows credenziali]

System.Security.Principal. WindowsIdentity.GetCurrent(). Nome: NT AUTHORITY \ NETWORK SERVICE

Messaggio rappresentazione

User.Identity: [Il mio Windows credenziali]

GetCurrent.Name: [Il mio Windows credenziali]

Rappresenta Undo

User.Identity: [il mio Windows credenziali]

GetCurrent.Name: NT AUTHORITY \ NETWORK SERVICE

Quindi, prima che impersonassi, l'utente corrente è l'account di sistema ma, dopo la rappresentazione, sta usando il mio account di dominio Windows che ha il permesso di creare file di testo sul server FTP. Il codice funziona localmente usando il server Web di Visual Studio ma non quando lo distribuisco su IIS sul nostro server di test.

Viene visualizzato un errore di accesso negato. Quale sarebbe la ragione dell'errore quando viene impersonato l'utente corretto?

risposta

22

La rappresentazione consente alla macchina di rappresentare la rappresentazione, pertanto il browser client e il server si trovano sulla stessa pagina quando si tratta della rappresentazione. Quando si tenta di accedere alla condivisione di rete, il computer non si fida delle credenziali rappresentate.

È necessario abilitare la delega per la macchina IIS in Active Directory. Passare ad Utenti e computer di Active Directory, trovare il computer, fare clic su Proprietà e 'Computer attendibile per la delega'. (Potrebbe essere necessario riavviare IIS affinché funzioni, non ricordo).

C'è molta più teoria di questa che non capisco completamente, ma dovrebbe funzionare. Che sia giusto o no, qualcun altro potrebbe commentare!

Inoltre, il motivo per cui funziona sul computer di sviluppo è che il server di sviluppo viene eseguito come sviluppatore, non (Locale) \ Servizio di rete.


Un collegamento decente:

http://msdn.microsoft.com/en-us/library/cc949004.aspx

Qual è la differenza tra la rappresentazione e la delega?

La rappresentazione trasmette l'identità del chiamante originale alle risorse di back-end sullo stesso computer. La delega trasmette l'identità del chiamante originale alle risorse di back-end su computer diversi dal computer che esegue il servizio.

Ad esempio, se un servizio è in esecuzione in IIS senza rappresentazione, il servizio accederà alle risorse utilizzando l'account ASP.NET in IIS 5.0 o l'account Servizio di rete in IIS 6.0. Con la rappresentazione, se il client si connette utilizzando l'account del chiamante originale, il servizio accederà a risorse come un database SQL Server sulla stessa macchina utilizzando l'account del chiamante originale anziché l'account ASP.NET di sistema. La delega è simile, ad eccezione del fatto che il database di SQL Server potrebbe trovarsi su un altro computer remoto rispetto al servizio.

+1

Questo era esattamente quello che stavo cercando di capire. Non mi ero reso conto che la rappresentazione non si trasmetteva su tutte le macchine. –

+0

Uomo, stavo provando l'imitazione per un paio di giorni, e improvvisamente mi fai capire che dovremmo andare con la delegazione! Grazie mille –