У меня возникла проблема с пониманием претензий, особенно ролей.Требования к идентификационной информации 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>
}
и вот выход. Что мне здесь не хватает?
И таблица имеет две роли
Update # 1
Я добавил имя и фамилию в качестве удаленных пунктов, зарегистрированных и как роли теперь отображаются. Я ничего не изменил. Так что теперь я больше запутывается ...
Вот провайдер добавить удаленные требования
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);
}
Этот ответ может помочь http://stackoverflow.com/questions/21688928/asp-net-identity-get-all-roles-of-logged-in-user –
Я смотрел на это раньше, но не мог понять его , В течение последнего часа или около того я читал об этом, и теперь это имеет больше смысла. Я поставил обновление # 1 в мой вопрос. Обе роли теперь отображаются, не знаю, почему они не отображались ранее. –
Я задам глупый вопрос - вы очистили файлы cookie в браузере? Вы вышли из системы и снова вошли в систему? – trailmax