J'ai une application ASP.NET 3.5 qui utilise l'authentification par formulaire ASP.NET. Je souhaite pouvoir obtenir le nom d'utilisateur Windows actuellement connecté à l'ordinateur (PAS connecté à l'application ASP.NET, mais à Windows) lorsque les données sont modifiées dans une page.
Si j'utilise Context.User.Identity.Name.Tostring()
, le nom d'utilisateur est enregistré dans l'application ASP.NET, mais le nom de compte Windows est nécessaire.
System.Security.Principal.WindowsIdentity.GetCurrent().Name.Tostring()
En outre, cela ne fonctionne que lorsque j'exécute le site Web à partir de Visual Studio, mais après le déploiement sur IIS, il renvoie NT AUTHORITY\SYSTEM .
Vous devez définir le mode d'authentification sur Windows
dans votre configuration et également désactiver les utilisateurs anonymes dans la balise d'autorisation.
Pour obtenir l'utilisateur actuellement connecté à un compte Windows, vous devez utiliser Windows authentication
au lieu de Forms authentication
:
System.Security.Principal.WindowsIdentity.GetCurrent (). Name.Tostring () fonctionne également uniquement lorsque je gère le site Web à partir de Visual Studio, mais après en déployant sur IIS, il retourne NT AUTHORITY\SYSTEM
Il montre l'utilisateur actuel de l'application. Lorsque vous hébergez votre application sur le serveur Web Visual Studio, il utilise votre compte local. Cependant, lorsque vous vous connecterez à l'application Web avec des informations d'identification différentes, votre connexion Windows actuelle sera toujours indiquée.
Une application déployée sur IIS utilise le compte NT AUTHORITY\SYSTEM dans votre cas.
Pour obtenir l'utilisateur actuellement connecté à Windows en C #, utilisez:
string Username = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();
J'ai lutté et lutté et lutté avec cela. Une des choses est que je n’ai pas accès à IIS, il est verrouillé et je ne peux donc modifier aucun des paramètres du serveur. Je devais aller avec ce que j'étais capable de faire dans le code. Lors de mes recherches, de nombreuses réponses disaient: "installez IIS comme ceci". . C'est bien quand vous avez accès à IIS, mais je ne travaillais pas avec ce que je pouvais faire avec du code. Alors, j'ai fini par le gérer comme ça:
Dans mon fichier de configuration Web, j'ai ajouté les lignes de code suivantes dans le fichier section:
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="false" />
<windowsAuthentication enabled="true" />
</authentication>
</security>
</system.webServer>
Ensuite, il a renvoyé une erreur sur mon local, que je devais entrer et réparer. Je suis allé au fichier applicationhost.config situé dans le chemin suivant sur ma machine (le vôtre peut être différent):
C:\utilisateurs\"votre nom d'utilisateur"\Mes documents\"votreIISInstallation"\config\applicationhost.config
et j'ai changé les paramètres suivants pour "autoriser", qui avait été défini sur "refuser":
<section name="anonymousAuthentication" overrideModeDefault="Deny" />
changé en
<section name="anonymousAuthentication" overrideModeDefault="Allow" />
et
<section name="windowsAuthentication" overrideModeDefault="Deny" />
à
<section name="windowsAuthentication" overrideModeDefault="Allow" />
dans le
<sectionGroup name="authentication">
section. Avant que je découvre ce correctif, je me tirais les cheveux. J'espère que ça aidera quelqu'un. Dès que j'ai inséré le code ci-dessus dans le fichier webconfig, cela fonctionnait sur l'intranet, il renvoyait simplement les erreurs dans mon local, mais dès que j'ai ajouté ce qui précède à mon fichier applicationhost.config local, il a commencé à fonctionner sur mon ainsi que. Ensuite, j'ai appelé la variable suivante pour renvoyer le nom de l'utilisateur connecté sous Windows:
HttpContext.Current.User.Identity.Name.ToString().Substring((HttpContext.Current.User.Identity.Name.ToString().IndexOf("\\")) + 1);
À votre santé!
J'utilise ceci:
System.Security.Principal.WindowsPrincipal user;
user = new WindowsPrincipal(this.Request.LogonUserIdentity);
this.Request.LogonUserIdentity.Impersonate();
user_name = user_name.Substring(user_name.LastIndexOf("\\") + 1);
string strName = HttpContext.Current.User.Identity.Name.ToString();
comme vous le souhaitiez, c’est correct, mais vous devez d’abord configurer le serveur Web en vous référant à Comment obtenir un nom d’utilisateur enregistré dans Windows NT avec ASP.NET (premières étapes pour la configuration d’un serveur Web) .
J'ai réussi à résoudre ce problème en suivant les instructions figurant dans la méthode 1 à l'adresse suivante: https://support.Microsoft.com/en-us/help/896861/you-receive-error-401-1- Lorsque vous naviguez sur un site Web qui utilise Integration En bref, désactivez toutes les méthodes d'authentification, à l'exception de l'authentification Windows . Ouvrez regedit sous un compte administrateur, recherchez HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0, cliquez avec le bouton droit de la souris sur le nœud, sélectionnez Nouveau, puis sélectionnez Valeur multi-chaînes. Entrez "BackConnectionHostNames" et cliquez sur Entrée . Pour Value, entrez le site Web sur lequel vous souhaitez définir l'accès et cliquez sur OK . Redémarrez IIS Une fois que j'avais fait cela, j'ai pu obtenir l'utilisateur Windows actuel qui utilise HttpContext.Current.User.Identity.Name, WindowsPrincipal (this.Request.LogonUserIdentity) m'a également fourni le nom d'utilisateur Windows connecté . Pour référence, System.Environment.UserName et System.Security.Principal.WindowsIdent .GetCurrent (). Name, les deux ont toujours donné l’utilisateur IIS.
Cela m'a pris des siècles pour aller au fond des choses. Bonne chance. IIS est un cauchemar éveillé!
Essayez avec la ligne de code ci-dessous:
string loggedOnUser = string.Empty;
loggedOnUser = Request.ServerVariables.Get("AUTH_USER");
Il se peut que vous n'obteniez pas les valeurs lorsque vous exécutez l'application à partir de Visual Studio ... Vérifiez-la après son déploiement dans IIS.
Pour obtenir le nom d'utilisateur, utilisez:
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";
}
}