2014-11-26 13 views
10

Używam ASP.NET Identity 2.0 i MVC. Muszę zalogować użytkownika w jego imieniu, nazwisku, e-mailu itp. Jak to uzyskać? Mogę uzyskać tylko @ User.Identity, ale nie ma mojej właściwości klasy użytkownika.Pobierz identyfikator tożsamości ASP.NET Bieżący użytkownik w widoku

//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; } 
} 

Odpowiedz

15

Jeśli istnieją tylko specyficzne właściwości, które trzeba uzyskać, możesz dodać je jako należności w swojej klasie ApplicationUser jak w poniższym przykładzie:

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

ten dostaje się przewodowej z klasy 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>()) 
       ) 

     } 
    }); 

Następnie można uzyskać dostęp do roszczeń (w widoku lub w kontrolerze):

var claims = ((System.Security.Claims.ClaimsIdentity)User.Identity).Claims; 
var claim = claims.SingleOrDefault(m => m.Type == "FullName"); 

Nie ma tutaj biletów potwierdzających autentyczność formularzy.

Jeśli chcesz pełne dane użytkowników są dostępne, można zawsze utworzyć metodę rozszerzenia jak następuje:

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

i nazwać tak:

@User.Identity.GetApplicationUser(); 

Polecam buforowanie jeśli jednak przez cały ten czas.

+0

wspaniałe! !! To ratuje mi życie –

4

Istnieją dwa sposoby osiągnięcia tego celu.

1) Utwórz własne CustomPrincipal przez dziedziczenie IPrincipal interfejs obejmują Name, Surname i Email użyciu this przykład lub this jeden.

2) Uzyskaj szczegóły bezpośrednio z bazy danych i przekaż ją jako model do widoku.

Metoda pierwsza będzie dobrym rozwiązaniem, jeśli chcesz użyć tych samych szczegółów użytkownika w kilku widokach, ale metoda druga to najprostszy sposób, aby to osiągnąć. daj mi znać, jeśli potrzebujesz pomocy w kodzie dla drugiej metody.

+1

Zgoda: Użyłem CustomPrincipal - znacznie prostsze zawinąć rzeczy tam i wtedy tych „atrybutów” od użytkownika dostępne są wszędzie .. –

0

aby uzyskać informacje na temat użytkownika z kontrolerem ty musi używać

User.Identity.GetUserId(); 

lub jeśli chcesz uzyskać informacje na temat użytkownika w swojej klasie

HttpContext.Current.User.Identity.GetUserId(); 
0

można łatwo używać @inject wywołanie funkcji do wstrzykiwania zarówno UserManager i SignInManager.

Państwa zdaniem należy dodać następujące:

@inject SignInManager<YourUserIdentity> SignInManager 
@inject UserManager<YourUserIdentity> UserManager 

Po wstrzyknięciu, powinieneś być w stanie pracować z UserManager i SignInManager metod.Na przykład:

@if (SignInManager.IsSignedIn(User)) 
{ 
    <a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @UserManager.GetUserName(User)</a> 
} 
else 
{ 
} 

Należy zwrócić uwagę na przekazanie obiektu User kiedy trzeba odwołać obecny zalogowanego użytkownika.

nadzieję, że będzie przydatny dla każdego :)

+0

Ważne, aby zauważyć, że @inject to funkcja Core programu ASP.Net. W odpowiedzi na pytanie zadane zostało ASP.Net Core. Jest mało prawdopodobne, aby odpowiedział na pytanie Yargicx. Ale dobrym narzędziem jest aplikacja internetowa ASP.net Core – WizardHammer

Powiązane problemy