2013-04-24 17 views
17

Possiedo un'applicazione ASP.NET 3.5 che utilizza l'autenticazione dei moduli ASP.NET. Voglio essere in grado di ottenere il nome utente di Windows attualmente connesso al computer (NON connesso all'applicazione ASP.NET, ma a Windows) quando i dati vengono modificati in una pagina.Come ottengo l'account Windows attualmente connesso da una pagina ASP.NET?

Se utilizzo Context.User.Identity.Name.Tostring(), ottengo il nome utente registrato nell'applicazione ASP.NET, ma ho bisogno del nome dell'account di Windows.

System.Security.Principal.WindowsIdentity.GetCurrent().Name.Tostring() 

Inoltre, funziona solo quando si esegue il sito Web da Visual Studio, ma dopo la distribuzione di IIS si restituisce NT AUTHORITY \ SYSTEM.

+1

Utilizzare l'autenticazione di Windows. Altrimenti, come saprà il browser e perché invierà al server, quale utente di Windows ha effettuato l'accesso? – CodeCaster

+0

@CodeCaster, dovrei farlo completamente impossibile usando l'autenticazione dei moduli ?. Le applicazioni utilizzano i ruoli per il controllo dei livelli di accesso, ma mi piacerebbe ottenere l'account Windows corrente per alcune audizioni di backend – StackTrace

+0

I ruoli non sono associati a un metodo di autenticazione specifico, è possibile utilizzarli anche con l'autenticazione di Windows. È un'applicazione intranet? – CodeCaster

risposta

10

È necessario impostare la modalità di autenticazione su Windows nella configurazione & disabilitare anche gli utenti anonimi nel tag di autorizzazione.

+0

Ciao, ho due moduli nello stesso progetto il modulo client e admin.Il sito Web di Client dispone di una pagina di accesso e il modulo di amministrazione usa la modalità windowsAuth..se imposto la modalità in .config, allora avrà effetto sul modulo client? – user3217843

+0

Come disabilitare gli utenti anonimi nel tag di autorizzazione? –

0

Prova con la riga seguente di codice:

string loggedOnUser = string.Empty; 
loggedOnUser = Request.ServerVariables.Get("AUTH_USER"); 

Non può essere sempre i valori quando si esegue l'applicazione da Visual Studio ... Check dopo schierato in IIS.

Per ottenere il nome utente, utilizzare:

string userName = string.Empty; 
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "Your Domain Name")) 
{ 
    UserPrincipal user = new UserPrincipal(pc); 
    user = UserPrincipal.FindByIdentity(pc, "User ID Will Come here"); 
    if (user != null) 
    { 
     userName = user.GivenName + " " + user.Surname; 

    } 
    else 
    { 
     //return string.Empty; 
     userName = "User Not Found"; 
    } 
} 
8

Per ottenere l'utente attualmente connesso a un account Windows è necessario utilizzare Windows authentication invece di Forms authentication:

System.Security.Principal .WindowsIdentity.GetCurrent(). Name.Tostring() funziona anche quando eseguo il sito Web da Visual Studio ma dopo la distribuzione in IIS restituisce NT AUTHORITY \ SYSTEM

Mostra l'utente corrente dell'applicazione. Quando si ospita la propria applicazione sul server Web di Visual Studio, viene utilizzato l'account locale. Tuttavia, quando si accede all'applicazione Web con credenziali diverse, verrà sempre visualizzato il login corrente di Windows.

Un'applicazione distribuita su IIS utilizza l'account NT AUTHORITY \ SYSTEM nel tuo caso.

4

Io uso questo:

System.Security.Principal.WindowsPrincipal user; 
user = new WindowsPrincipal(this.Request.LogonUserIdentity); 
this.Request.LogonUserIdentity.Impersonate(); 
user_name = user_name.Substring(user_name.LastIndexOf("\\") + 1); 
4

Per ottenere l'utente attualmente connesso a Windows in C#, l'uso:

string Username = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString(); 
1

ho lottato e lottato e lottato con questo. Una delle cose è che non ho accesso a IIS, che è bloccato, quindi non posso modificare nessuna delle impostazioni del server. Dovevo andare con quello che ero capace di fare in codice. Quando ho effettuato una ricerca, molte delle risposte hanno detto "imposta IIS in questo modo". . .bene, è fantastico quando si ha accesso a IIS, ma non l'ho fatto - ho dovuto lavorare con quello che potevo fare nel codice.Così, ho finito per gestire in questo modo:

Nel mio file di configurazione web, ho aggiunto le seguenti righe di codice all'interno della sezione :

<system.webServer> 
<security> 
    <authentication> 
    <anonymousAuthentication enabled="false" /> 
    <windowsAuthentication enabled="true" /> 
    </authentication> 
</security> 
</system.webServer> 

Poi, è tornato un errore sul mio locale, che dovevo andare a riparare. Sono andato al file applicationhost.config situato nel seguente percorso sulla mia macchina (il tuo potrebbe essere diverso):

C: \ users \ "il tuo nome utente" \ My Documents \ "yourIISInstallation" \ config \ applicationhost.config

e ho cambiato le seguenti impostazioni per "consentire", che era stato impostato su "negare":

<section name="anonymousAuthentication" overrideModeDefault="Deny" /> 

cambiato in

<section name="anonymousAuthentication" overrideModeDefault="Allow" /> 

e

<section name="windowsAuthentication" overrideModeDefault="Deny" /> 

a

<section name="windowsAuthentication" overrideModeDefault="Allow" /> 

nella sezione

<sectionGroup name="authentication"> 

. Prima di scoprire questa soluzione, mi stavo strappando i capelli. Spero che questo aiuti qualcuno. Non appena ho inserito il codice sopra nel file webconfig, ha funzionato sulla intranet, ha appena restituito errori nel mio locale, ma non appena ho aggiunto quanto sopra al mio file applicationhost.config locale, ha iniziato a lavorare sul mio locale anche. Quindi, ho chiamato la seguente variabile per restituire il nome dell'utente connesso su Windows:

HttpContext.Current.User.Identity.Name.ToString().Substring((HttpContext.Current.User.Identity.Name.ToString().IndexOf("\\")) + 1); 

Cheers!