Domanda

Ho un'applicazione Web MVC su una rete intranet e desidero poter creare file sul nostro server FTP da inviare a partner esterni.

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 imitazione

User.Identity.Name: [credenziali di Windows]

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

Rappresentazione post

User.Identity: [credenziali di Windows]

GetCurrent.Name: [credenziali di Windows]

Annulla impersonale

User.Identity: [credenziali di Windows]

GetCurrent.Name: NT AUTHORITY \ NETWORK SERVICE

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

Ricevo un errore di accesso negato. Quale sarebbe la ragione dell'errore quando si impersona l'utente corretto?

È stato utile?

Soluzione

La rappresentazione consente la rappresentazione da macchina a macchina, quindi il browser client e il server si trovano sulla stessa pagina quando si tratta della rappresentazione. Quando si tenta quindi 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. Vai su Utenti e computer di Active Directory, trova il computer, fai clic su Proprietà e "Confida computer per delega". (Potrebbe essere necessario riavviare IIS affinché funzioni, non ricordo.)

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

Inoltre, il motivo per cui funziona sulla macchina di sviluppo è che il server di sviluppo funziona come sviluppatore, non (locale) \ Servizio di rete.


Un collegamento decente:

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

  

Qual è la differenza tra rappresentazione e delega?

     

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

     

Ad esempio, se un servizio è in esecuzione all'interno di IIS senza rappresentazione, il servizio accederà alle risorse utilizzando l'account ASP.NET in IIS 5.0 o l'account del servizio di rete in IIS 6.0. Con imitazione, se il client si connette utilizzando l'account del chiamante originale, il servizio accederà a risorse come un database SQL Server sullo stesso computer utilizzando l'account del chiamante originale anziché l'account ASP.NET del sistema. La delega è simile, tranne per il fatto che il database di SQL Server potrebbe trovarsi su un altro computer remoto al servizio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top