2014-03-07 6 views
23

Ich habe die OWIN-Authentifizierung in meiner Anwendung verwendet.Zugriff Anspruchswerte im Controller in MVC 5

Anmeldung Aktion

var claims = new List<Claim>(); 
claims.Add(new Claim(ClaimTypes.Name, result.UserFirstName));    
claims.Add(new Claim(ClaimTypes.Sid, result.UserID.ToString())); 
var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); 

Ich möchte aus verschiedenen Maßnahmen, um die Benutzernamen und Benutzer-ID zugreifen. Wie kann ich auf die Werte zugreifen, die in den Ansprüchen hinzugefügt werden?

aktualisieren Ich habe

versucht
var claims = new List<Claim>(); 
claims.Add(new Claim(ClaimTypes.Name, result.UserFirstName + " " + result.UserLastName));    
claims.Add(new Claim(ClaimTypes.Sid, result.UserIDNumber.ToString())); 
var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); 
var authenticationManager = Request.GetOwinContext().Authentication; 
authenticationManager.SignIn(identity); 

var claimsPrincipal = new ClaimsPrincipal(identity); 
Thread.CurrentPrincipal = claimsPrincipal; 

enter image description here

ich die Werte innerhalb des schnellen Fenster anzeigen können. Aber obwohl ich nicht auf den Wert zugreifen konnte. Wie bekomme ich den Wert?

Antwort

46

Sie benötigen Thread.CurrentPrincipal nach dem Login setzen heißt

var claims = new List<Claim>(); 
claims.Add(new Claim(ClaimTypes.Name, result.UserFirstName));    
claims.Add(new Claim(ClaimTypes.Sid, result.UserID.ToString())); 
var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); 
var claimsPrincipal = new ClaimsPrincipal(identity); 
// Set current principal 
Thread.CurrentPrincipal = claimsPrincipal; 

Dann Im Folgenden werden die Werte abrufen.

//Get the current claims principal 
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal; 

// Get the claims values 
var name = identity.Claims.Where(c => c.Type == ClaimTypes.Name) 
        .Select(c => c.Value).SingleOrDefault(); 
var sid = identity.Claims.Where(c => c.Type == ClaimTypes.Sid) 
        .Select(c => c.Value).SingleOrDefault(); 
+0

Noch habe ich keine Antwort bekommen. Können Sie bitte das Update in der obigen Frage überprüfen? Ich habe das Problem beschrieben. – Golda

+0

@Golda Hallo, das offene Debug-Fenster sollte schauen, was in Claims ist, können Sie das stattdessen öffnen? – hutchonoid

+0

@Golda Hang-on, habe es mir 2 Minuten zu aktualisieren Frage. – hutchonoid

10

Hier ist ein weiteres Beispiel, mit Typen benutzerdefinierten Anspruch auch:

Anmeldung:

var claims = new List<Claim> 
{ 
    new Claim(ClaimTypes.Name, user.Name, ClaimValueTypes.String), 
    new Claim(ClaimTypes.Email, user.Email ?? string.Empty, ClaimValueTypes.Email), 
    new Claim(ClaimTypes.PrimarySid, user.Id.ToString(), ClaimValueTypes.Integer), 
    new Claim(CustomClaimTypes.SalesId, user.SalesId.ToString(), ClaimValueTypes.Integer) 
}; 

var claimsIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); 
AuthenticationManager.SignIn(claimsIdentity); 

Individuelle Ansprüche:

public static class CustomClaimTypes 
{ 
    public const string SalesId = "SalesId"; 
} 

Erweiterungsmethoden:

public static class IdentityExtensions 
{ 
    public static int GetSalesId(this IIdentity identity) 
    { 
     ClaimsIdentity claimsIdentity = identity as ClaimsIdentity; 
     Claim claim = claimsIdentity?.FindFirst(CustomClaimTypes.SalesId); 

     if (claim == null) 
      return 0; 

     return int.Parse(claim.Value); 
    } 

    public static string GetName(this IIdentity identity) 
    { 
     ClaimsIdentity claimsIdentity = identity as ClaimsIdentity; 
     Claim claim = claimsIdentity?.FindFirst(ClaimTypes.Name); 

     return claim?.Value ?? string.Empty; 
    } 
} 

kann dann wie folgt zugegriffen werden:

User.Identity.GetSalesId(); 
User.Identity.GetName(); 
Verwandte Themen