2015-11-27 3 views
8

У меня возникла проблема с пониманием претензий, особенно ролей.Требования к идентификационной информации ASP.NET

После дает мне две роли, назначенные пользователю

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

Но когда я получаю претензии и итерацию через него, я получаю только первую роль. У меня нет обеих ролей. Обратите внимание, что я не устанавливал роли в претензиях во время входа в систему.

Действие Код

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

и соответствующий код вид

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

и вот выход. Что мне здесь не хватает?

enter image description here

И таблица имеет две роли

enter image description here

Update # 1

Я добавил имя и фамилию в качестве удаленных пунктов, зарегистрированных и как роли теперь отображаются. Я ничего не изменил. Так что теперь я больше запутывается ...

enter image description here

Вот провайдер добавить удаленные требования

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

и действие Логин использовать поставщик претензий

[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

Этот ответ может помочь http://stackoverflow.com/questions/21688928/asp-net-identity-get-all-roles-of-logged-in-user –

+0

Я смотрел на это раньше, но не мог понять его , В течение последнего часа или около того я читал об этом, и теперь это имеет больше смысла. Я поставил обновление # 1 в мой вопрос. Обе роли теперь отображаются, не знаю, почему они не отображались ранее. –

+0

Я задам глупый вопрос - вы очистили файлы cookie в браузере? Вы вышли из системы и снова вошли в систему? – trailmax

ответ

1

It сложно сказать наверняка, но я думаю, что здесь произошло то, что претензии были кэшированы в файле cookie, который используется для аутентификации пользователя. Когда пользователь впервые регистрирует заявки, считываются из базы данных, cookie создается с претензиями и сохраняется в браузере пользователей. Все дальнейшие запросы считывают информацию о требованиях пользователей из файла cookie до истечения срока его действия. У меня есть подробное сообщение в блоге, которое я написал некоторое время назад на ASP.NET Identity Cookie Expiration для получения дополнительной информации о том, как управлять истечением срока действия.

Некоторые из ваших формулировок предлагают (только догадки с моей стороны) о том, что роли были добавлены после того, как пользователь уже выполнил вход, и поэтому роли не были добавлены в файл cookie и не будут распечатываться. Претензии обновились, когда вы добавили код для добавления имен, потому что одна из нескольких причин:

  1. Срок действия файла cookie истек, и вам нужно было ввести новый логин.
  2. Вы вышли (который удалил файл cookie), а затем сделал новый вход.
  3. Вы остались в системе, но когда вы повторно отправил к login действия у вас есть призыв к signout, а затем signin который обновляется печенье:

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

Вы можете дублировать поведение, где наблюдается :

  1. Убедитесь, что пользователь не зарегистрирован
  2. Удалить роли пользователя из AspNetUserRoles таблицы
  3. Подписание пользователя в
  4. Добавить роли обратно пользователю в AspNetUserRoles таблице (либо вручную, либо с помощью какого-либо действия через приложение, где вы управляете роли для пользователей)
  5. печати роли
  6. Вы не увидите роли в распечатке.
  7. Затем подпишите пользователя и запишите его обратно, и вы увидите ожидаемые роли.

Каждый раз, когда вы добавляете роль или требование, вам нужно будет вручную выйти из системы или вы можете позвонить, обновляя файл cookie, как я упоминал ранее. Это answer here дает некоторый контекст о том, как эффективно обновлять файл cookie.

Смежные вопросы