J'utilise ASP.NET Identity 2.0 et MVC. J'ai besoin de connecter le nom de l'utilisateur, nom de famille, email, etc. en vue. Comment peut l'obtenir? Je peux obtenir seulement @ User.Identity mais il n'y a pas de propriété de ma classe d'utilisateurs.
//in my view, i need here my ApplicationUser class
<div>
@User.Identity.Name
</div>
//ApplicationUser class
public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,
CustomUserClaim>
{
public ApplicationUser()
{
this.CreatedDate = DateTime.Now;
}
public DateTime CreatedDate { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string TaxOffice { get; set; }
}
Si vous ne devez obtenir que des propriétés spécifiques, vous pouvez les ajouter en tant que revendications dans votre classe ApplicationUser, comme dans l'exemple suivant:
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity.AddClaim(new Claim("FullName", this.FullName));
// or use the ClaimTypes enumeration
return userIdentity;
}
Cela est câblé depuis la classe Startup.Auth:
SessionStateSection sessionStateSection = ConfigurationManager.GetSection("system.web/sessionState") as SessionStateSection;
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/account/login"),
CookieName = sessionStateSection.CookieName + "_Application",
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>
(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => (id.GetUserId<int>())
)
}
});
Ensuite, vous pouvez accéder à la revendication (dans une vue ou dans un contrôleur):
var claims = ((System.Security.Claims.ClaimsIdentity)User.Identity).Claims;
var claim = claims.SingleOrDefault(m => m.Type == "FullName");
Aucun ticket d'authentification de formulaires ici.
Si vous souhaitez que les détails complets de l'utilisateur soient disponibles, vous pouvez toujours créer une méthode d'extension du type suivant:
public static ApplicationUser GetApplicationUser(this System.Security.Principal.IIdentity identity)
{
if (identity.IsAuthenticated)
{
using (var db = new AppContext())
{
var userManager = new ApplicationUserManager(new ApplicationUserStore(db));
return userManager.FindByName(identity.Name);
}
}
else
{
return null;
}
}
Et appelez ça comme ça:
@User.Identity.GetApplicationUser();
Je recommanderais toutefois la mise en cache si vous appelez tout ce temps.
Vous pouvez y parvenir de deux manières.
1) Créez votre propre CustomPrincipal
en héritant de l'interface IPrincipal
pour inclure Name
, Surname
et Email
en utilisant this example ou this one.
2) Obtenez les détails directement à partir de la base de données et transmettez-les comme modèle à la vue.
La méthode 1 sera une bonne option si vous souhaitez utiliser les mêmes détails d'utilisateur dans plusieurs vues, mais la méthode 2 est le moyen le plus simple d'y parvenir. faites-moi savoir si vous avez besoin d'aide de code pour la deuxième méthode.
Vous pouvez facilement utiliser l’appel@inject
pour injecter UserManager
et SignInManager
.
A votre avis, ajoutez ce qui suit:
@inject SignInManager<YourUserIdentity> SignInManager
@inject UserManager<YourUserIdentity> UserManager
Après l'injection, vous devriez pouvoir travailler avec les méthodes UserManager
et SignInManager
. Par exemple:
@if (SignInManager.IsSignedIn(User))
{
<a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @UserManager.GetUserName(User)</a>
}
else
{
}
Faites attention lorsque vous passez l'objet
User
lorsque vous devez référencer l'utilisateur actuellement connecté.
J'espère que cela sera pratique pour tout le monde :)
pour obtenir des informations sur l'utilisateur à partir du contrôleur que vous devez utiliser
User.Identity.GetUserId();
ou si vous souhaitez obtenir des informations sur l'utilisateur dans votre classe
HttpContext.Current.User.Identity.GetUserId();