2016-07-26 4 views
1

In meinem Projekt ASP verwende ich ASP.NET Identity 2.2.1. An vielen Stellen muss ich eine aktuelle (eingeloggte) Benutzer-E-Mail erhalten. Im Moment bin ich zu finden, dass die Benutzer dies mit:Security.Principal.IIdentity Erweiterung Methode zum Abrufen von Benutzer E-Mail

var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<int>()); 
var email = user.Email; 

Ich habe bemerkt, dass GetUserId<T> ist eine Erweiterung Methode, die innerhalb IdentityExtensions Klasse innerhalb Microsoft.AspNet.Identity

ich meine eigene Extension-Methode erstellt haben gefunden werden kann das vereinfacht die E-Mail bekommen, indem man sie erhalten, wie:

var email = User.Identity.GetUserEmail() 

Unter meiner Erweiterung ist:

public static class MyIIdentityExtensions 
{ 
    public static string GetUserEmail(this IIdentity identity) 
    { 
     if (identity == null) 
     { 
      throw new ArgumentNullException("identity"); 
     } 
     var ci = identity as ClaimsIdentity; 
     if (ci == null) return null; 
     var um = HttpContext.Current.GetOwinContext().GetUserManager<UserManager>(); 
     if (um == null) return null; 
     var user = um.FindById(ci.GetUserId<int>()); 
     if (user == null) return null; 
     return user.Email; 
    } 
} 

Aber es ist viel komplizierter, als build-in extension methods

Kann ich diese vereinfachen? Vielleicht gibt es dafür eine eingebaute Methode? Was ich will ist ein einfacher Weg, um Email für den aktuell angemeldeten Benutzer von User.Identity zu erhalten.

Antwort

2

Wenn Sie UserManager verwenden, drücken Sie die Datenbank bei jedem Aufruf der Methode GetUserEmail.

Stattdessen können Sie die E-Mail als Anspruch hinzufügen. Innerhalb ApplicationUser Klasse gibt es GenerateUserIdentityAsync Methode

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> 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(ClaimTypes.Email, this.Email)); 
    return userIdentity; 
} 

dann Ihre Erweiterungsmethode es

public static class IdentityExtensions 
{ 
    public static string GetUserEmail(this IIdentity identity) 
    { 
     if (identity == null) 
     { 
      throw new ArgumentNullException("identity"); 
     } 
     var ci = identity as ClaimsIdentity; 
     if (ci != null) 
     { 
      return ci.FindFirstValue(ClaimTypes.Email); 
     } 
     return null; 
    } 
} 
+0

zu bekommen ich habe ganz vergessen zu 'GenerateUserIdentityAsync' Methode. Ich habe sogar den gleichen Kommentar '// Fügen Sie hier benutzerdefinierte Benutzeransprüche hinzu. Ich habe noch eine weitere Frage: Kann ich diesen Anspruch vom JWT-Token entfernen, das zurückgegeben wird, wenn der Benutzer sich anmeldet? Was ich will, ist minimale Datenmenge in JWT-Token zurückgeben. Aber von anderer Seite, wenn ich diesen Anspruch von Token in allen Anfragen entferne, kann ich diese E-Mail-Adresse nicht bekommen, weil ich diesen Anspruch nicht habe. – Misiu

+0

@Misiu diese Zeile von Kommentaren gibt es von Standard-Vorlage mvc5 :) Über Ihre zusätzliche Frage, ist es nicht klar, was Sie wollen. Sie möchten den Anspruch für einige Anfragen hinzufügen? – tmg

+0

Sorry für Verwirrung. Ich möchte diesen Anspruch serverseitig zugänglich machen, aber nicht an den Client innerhalb des JWT-Tokens senden. Wahrscheinlich ist das nicht möglich, aber ich bin mir sicher. – Misiu

Verwandte Themen