Я использую идентификатор ASP.NET (v2) с Entity Framework. Я создаю страницу с несколькими флажками, каждая из которых представляет заявку. Нажатие кнопки (SavePrivileges
функция в моем примере) Я хотел бы настроить претензии данного пользователя в соответствии с состоянием моих флажков, то есть удалять претензии, которые не проверяются, и добавлять претензии, которые проверяются.Удалить претензии от пользователя
Добавление претензий работает нормально. Однако я, похоже, не могу удалить претензии от пользователя. После вызова manager.RemoveClaim
я получаю InvalidOperationException, говоря, что коллекция изменилась. Я действительно получаю это исключение, даже если я не изменю коллекцию user.Claims
.
Вот мой упрощенный пример сценария:
protected void SavePrivileges(string userId)
{
const string claim1Type = "...";
const string claim2Type = "...";
const string claim1Value = "...";
const string claim2Value = "...";
var store = new UserStore<IdentityUser>();
var manager = new UserManager<IdentityUser>(store);
var user = manager.FindById(userId);
// Lists to keep track of changes
var removed = new List<Claim>();
var added = new List<Claim>();
bool claim1Checked = CheckBox1.Checked;
bool claim2Checked = CheckBox2.Checked;
bool claim1Possesed = user.Claims.FirstOrDefault(claim => claim.ClaimValue == claim1Value &&
claim.ClaimType == claim1Type) != null;
bool claim2Possesed = user.Claims.FirstOrDefault(claim => claim.ClaimValue == claim2Value &&
claim.ClaimType == claim2Type) != null;
if (claim1Checked && !claim1Possesed)
{
added.Add(new Claim(claim1Type, claim1Value));
}
else if (!claim1Checked && claim1Possesed)
{
removed.Add(new Claim(claim1Type, claim1Value));
}
// + The same for claim2...
// Remove extra claims
foreach (Claim claim in removed)
{
manager.RemoveClaim(user.Id, claim);
}
// Add new claims
foreach (Claim claim in added)
{
IdentityUserClaim identityUserClaim = new IdentityUserClaim { ClaimType = claim.Type, ClaimValue = claim.Value };
user.Claims.Add(identityUserClaim);
}
// Save the result
var result = manager.Update(user);
if (result.Succeeded)
{
store.Context.SaveChanges();
}
}
Спасибо за любую помощь.
Да, я борюсь с одним и тем же, а не из-за внешней петли. Я отследил его до метода 'RemoveClaimsAsync' в UserStore и код: ' '' foreach (TUserClaim локальный в перечисляемом) { this._userClaims.Remove (local); } '' ' У кого-нибудь есть идея? –
Да, я закончил в том же месте ... –