2017-05-06 4 views
1

Derzeit mache ich ein SPA mit eckigen 4 & Netzkern 1.1. Mein System verwendet JWT zum Überprüfen der Benutzeridentität. Jedes Mal, wenn der Benutzer auf mein System zugreift, möchte ich seine Identität (Status, Rolle) in der Datenbank überprüfen und auf HttpContext.Identity aktualisieren.Einfügen mehr Anspruch in Identität OnTokenValidated Ereignis von JWT Bearer

Hier ist mein Code:

OnTokenValidated = async context => 
{ 
    // Find unit of work. 
    var unitOfWork = context.HttpContext.RequestServices.GetService<IUnitOfWork>(); 
    var identityService = context.HttpContext.RequestServices.GetService<IIdentityService>(); 

    // Find claim identity attached to principal. 
    var claimIdentity = (ClaimsIdentity)context.Ticket.Principal.Identity; 

    // Find email from claims list. 
    var email = 
     claimIdentity.Claims.Where(x => x.Type.Equals(ClaimTypes.Email)) 
      .Select(x => x.Value) 
      .FirstOrDefault(); 

    // Email is invalid. 
    if (string.IsNullOrEmpty(email)) 
     return; 

    // Find account information. 
    var condition = new SearchAccountViewModel(); 
    condition.Email = new TextSearch(); 
    condition.Email.Value = email; 
    condition.Email.Mode = TextComparision.Equal; 

    // Find accounts based on conditions. 
    var accounts = unitOfWork.RepositoryAccounts.Search(); 
    accounts = unitOfWork.RepositoryAccounts.Search(accounts, condition); 

    // Find the first matched account in the system. 
    var account = await accounts.FirstOrDefaultAsync(); 

    // Account is not found. 
    if (account == null) 
     return; 

    var identity = (ClaimsIdentity) identityService.InitiateIdentity(account); 
    identity.AddClaim(new Claim(ClaimTypes.Role, Enum.GetName(typeof(Roles), account.Role))); 
    identity.AddClaim(new Claim(ClaimTypes.Authentication, Enum.GetName(typeof(Statuses), account.Status))); 

    context.HttpContext.User = new ClaimsPrincipal(identity); 
} 

In meinem AccountController.cs ich eine Funktion haben:

/// <summary> 
/// Find personal profile. 
/// </summary> 
/// <returns></returns> 
[HttpGet("personal-profile")] 
public IActionResult FindProfile() 
{ 
    var identity = (ClaimsIdentity) Request.HttpContext.User.Identity; 
    var claims = identity.Claims.ToDictionary(x => x.Type, x => x.Value); 
    return Ok(claims); 
} 

Hier ist das Ergebnis habe ich:

{ 
    "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress": "[email protected]", 
    "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": "Goldarina Wharrier", 
    "auth_time": "1494072536661.38", 
    "nbf": "1494043736", 
    "exp": "1494047336", 
    "iss": "iConfess Ordinary", 
    "aud": "http://localhost:5001" 
} 

Nein Rolle oder Status wurden in die Identität einbezogen. Meine Frage ist: - Wie kann ich weitere Ansprüche in Anforderungsidentität nach Validierung Token und Suche nach Benutzerinformationen in der Datenbank hinzufügen.

Könnte mir bitte jemand helfen?

Danke,

+0

Also, wenn ich das richtig Sie eine api Ansprüche zurück fordern .. verstanden? Warum holen Sie nicht die Ansprüche vom jwt auf dem Klienten zurück? – Mardoxx

+0

Was passiert, wenn der Benutzer nicht mehr systemfähig ist? Zum Beispiel habe ich dir gestern einen Token für den Zugriff auf mein System gegeben, aber heute ändere ich deinen Account-Status auf Deaktiviert, um deinen Zugriff zu blockieren. Mein Zweck ist es, das Token zu validieren und es mit einigen weiteren Ansprüchen aus der Datenbank zu aktualisieren. – Redplane

+0

Verkürzen Sie Ihre Token-Lebensdauer! – Mardoxx

Antwort

0

Try this:

context.Principal.AddIdentity(identity); 
Verwandte Themen