2015-11-27 6 views
8

Ich habe ein Problem, die Ansprüche, insbesondere Rollen zu verstehen.ASP.NET Identitätsansprüche

Nach gibt mir zwei den Benutzer zugewiesenen Rollen

var roles = UserManager.GetRolesAsync(user.Id).Result; 

Aber wenn ich die Ansprüche erhalten und durchlaufen, ich nur die erste Rolle bekommen. Ich bekomme nicht beide Rollen. Bitte beachten Sie, dass ich zum Zeitpunkt der Anmeldung keine Rollen in den Ansprüchen eingerichtet habe.

Aktionscode

IEnumerable<Claim> claims = null; 
var identity = HttpContext.User.Identity as ClaimsIdentity; 
if (identity != null && identity.Claims != null && identity.Claims.Any()) 
{ 
    claims = identity.Claims; 
} 
return View(claims); 

und die entsprechende Ansicht Code

@model IEnumerable<System.Security.Claims.Claim> 
@{ 
    ViewBag.Title = "Display Claims"; 
} 

<h2>Display Claims</h2> 

@if (Model == null) 
{ 
    <p class="alert-danger">No claims found</p> 
} 
else 
{ 
    <table class="table table-bordered"> 
     <tr> 
      <th>Subject</th> 
      <th>Issuer</th> 
      <th>Type</th> 
      <th>Value</th> 
     </tr> 
     @foreach (var claim in Model.OrderBy(x => x.Type)) 
     { 
      <tr> 
       <td>@claim.Subject.Name</td> 
       <td>@claim.Issuer</td> 
       <td>@Html.ClaimType(claim.Type)</td> 
       <td>@claim.Value</td> 
      </tr> 
     } 
    </table> 
} 

und hier ist der Ausgang. Was fehlt mir hier?

enter image description here

Und die Tabelle hat die beiden Rollen

enter image description here

Update # 1

I Vornamen und Nachnamen als Fern Ansprüche, angemeldet und das addierte beide Rollen werden jetzt angezeigt. Ich habe nichts geändert. So, jetzt bin ich mehr verwirrt ...

enter image description here

Hier der Anbieter Fern Ansprüche

public static class ClaimsUserInfoProvider 
    { 
     public static IEnumerable<Claim> GetClaims(ClaimsIdentity user, ApplicationUser applicationUser) 
     { 
      var claims = new List<Claim>(); 

      claims.Add(CreateClaim(ClaimTypes.GivenName, applicationUser.FirstName + " " + applicationUser.LastName)); 

      return claims; 
     } 

     private static Claim CreateClaim(string type, string value) 
     { 
      return new Claim(type, value, ClaimValueTypes.String, "RemoteClaims"); 
     } 
    } 

und die Login-Aktion hinzufügen, um den Ansprüchen Anbieter verwenden

[HttpPost] 
     [AllowAnonymous] 
     [ValidateAntiForgeryToken] 
     public async Task<ActionResult> Login(LoginViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       var user = await UserManager.FindAsync(model.UserName, model.Password); 
       if (user == null) 
       { 
        ModelState.AddModelError("", "Invalid user name or password."); 
       } 
       else 
       { 
        var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); 
        //add claims 
        identity.AddClaims(ClaimsUserInfoProvider.GetClaims(identity, user)); 

        AuthenticationManager.SignOut(); 
        AuthenticationManager.SignIn(new AuthenticationProperties 
        { 
         IsPersistent = model.RememberMe 
        }, identity); 
        if (!String.IsNullOrEmpty(model.ReturnUrl)) 
        { 
         return Redirect(model.ReturnUrl); 
        } 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
      return View(model); 
     } 
+0

Diese Antwort kann helfen http://stackoverflow.com/questions/21688928/asp-net-identity-get-all-roles-of-logged-in-user –

+0

Ich schaute dies vor, aber konnte es nicht verstehen . Für die letzte Stunde oder so habe ich darüber gelesen und jetzt macht das mehr Sinn. Ich habe Update # 1 in meinen Fragepost gesetzt. Beide Rollen werden jetzt angezeigt. Sie wissen nicht, warum diese nicht früher angezeigt wurden. –

+0

Ich werde eine dumme Frage stellen - haben Sie die Cookies in einem Browser gelöscht? Haben Sie sich abgemeldet und wieder eingeloggt? – trailmax

Antwort

1

Es ist schwer zu sagen, aber ich denke, was hier passiert ist, dass Claims im Cookie zwischengespeichert wurden, der für die Authentifizierung des Benutzers verwendet wird. Wenn sich ein Benutzer zum ersten Mal anmeldet, werden die Ansprüche aus der Datenbank gelesen, ein Cookie wird mit den Ansprüchen erstellt und im Browser des Benutzers gespeichert. Alle weiteren Anfragen lesen die Benutzerinformationen vom Cookie bis zum Ablaufdatum. Ich habe einen ausführlichen Blog-Post auf Ich schrieb eine Weile zurück auf ASP.NET Identity Cookie Expiration für weitere Informationen zum Ablauf verwalten.

Einige Ihrer Formulierungen suggerieren (nur eine Vermutung von meiner Seite), dass die Rollen hinzugefügt wurden, nachdem der Benutzer sich bereits angemeldet hatte und daher die Rollen dem Cookie nicht hinzugefügt wurden und nicht ausgedruckt wurden. Die Ansprüche wurden aktualisiert, als Sie den Code zum Hinzufügen der Namen aus einem der folgenden Gründe hinzufügten:

  • Der Cookie war abgelaufen und Sie mussten eine neue Anmeldung vornehmen.
  • Sie haben sich abgemeldet (wodurch der Cookie entfernt wurde) und dann eine neue Anmeldung vorgenommen.
  • Sie waren angemeldet, aber wenn man die Wirkung login reposted haben Sie einen Anruf signout und dann signin, die das Cookie aktualisiert:

    AuthenticationManager.SignOut(); AuthenticationManager.SignIn(new AuthenticationProperties

  • Sie das Verhalten duplizieren können Sie wo erleben : Stellen Sie sicher

    1. der Benutzer
    2. abgemeldetenEntfernen Sie die Rollen des Benutzers aus der AspNetUserRoles Tabelle
    3. den Benutzer in
    4. hinzufügen die Rollen der Benutzer in der AspNetUserRoles Tabelle (entweder manuell oder durch eine Aktion über Ihre Anwendung, in der Sie Rollen für Benutzer verwalten) Signing zurück
    5. Drucken aus den Rollen
    6. Sie werden die Rollen im Ausdruck nicht sehen.
    7. Als nächstes signieren Sie den Benutzer und signieren sie wieder und Sie werden dann die erwarteten Rollen sehen.

      Jedes Mal, wenn Sie eine Rolle oder Claim hinzufügen, müssen Sie sich vom Benutzer manuell abmelden oder Sie können einen Anruf tätigen, der den Cookie aktualisiert, wie ich bereits erwähnt habe. Diese answer here gibt einen Überblick darüber, wie der Cookie effektiv aktualisiert werden kann.