web-dev-qa-db-fra.com

Obtenir l'utilisateur actuel de l'identité ASP.NET dans la vue

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; }
}
12
Yargicx

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.

18
ScottE

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.

4
DSR

Vous pouvez facilement utiliser l’appel@injectpour 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 :)

3
Adir Ratzon

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();
0
minenhle