C# ASP.NET EF6 Identity 2更新用户声明更新用户时出错
我有一个web应用程序,其中我使用ASP.NET Identity 2声明作为网站用户的访问控制列表。我在ApplicationUser模型中正确地提供了所有索赔,它有一个索赔列表 我试图为一个用户澄清声明,然后给他们一整套新的声明。 我有一个索赔组对象,其中包含索赔项目列表C# ASP.NET EF6 Identity 2更新用户声明更新用户时出错,c#,asp.net-mvc,asp.net-mvc-5,claims-based-identity,asp.net-identity-2,C#,Asp.net Mvc,Asp.net Mvc 5,Claims Based Identity,Asp.net Identity 2,我有一个web应用程序,其中我使用ASP.NET Identity 2声明作为网站用户的访问控制列表。我在ApplicationUser模型中正确地提供了所有索赔,它有一个索赔列表 我试图为一个用户澄清声明,然后给他们一整套新的声明。 我有一个索赔组对象,其中包含索赔项目列表 [HttpPost, ValidateAntiForgeryToken] public async Task<ActionResult> Claims_UpdateByClaimGroup([Bind(
[HttpPost, ValidateAntiForgeryToken]
public async Task<ActionResult> Claims_UpdateByClaimGroup([Bind(Include = "Id,SelectedClaimGroupId")] UserClaimsViewModel viewModel)
{
User user = await _repository.GetAsync<User>(viewModel.Id);
ApplicationUser appUser = await UserManager.FindByIdAsync(user.AppUser.Id);
var claimGroup = await _repository.GetAsync<ClaimGroup>(Convert.ToInt32(viewModel.SelectedClaimGroupId));
appUser.Claims.Clear();// Clear all the claims first
// Then add the new claims.
foreach (ClaimGroupItems claimGroupItem in claimGroup.Items)
{
//UserManager.AddClaim(user.AppUser.Id, new Claim(claimGroupItem.MenuItemId.ToString(), claimGroupItem.ClaimValue));
appUser.Claims.Add(new IdentityUserClaim()
{
ClaimType = claimGroupItem.MenuItemId.ToString(),
ClaimValue = claimGroupItem.ClaimValue,
UserId = user.AppUser.Id,
});
}
try
{
_repository.Save<User>(appUser.User);
//await UserManager.UpdateAsync(appUser);
}
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
validationErrors.Entry.Entity.GetType().FullName,
validationError.PropertyName,
validationError.ErrorMessage);
}
}
throw; // You can also choose to handle the exception here...
}
return RedirectToAction("Claims", new { id = viewModel.Id, Updated = true });
}
此错误是由以下调用引起的:
appUser.Claims.Clear()
我如何才能正确地为用户更新声明?我让它工作起来了。出于某种原因,appUser.Claims.Clear()无法工作,并导致userId为null错误。所以我在一个循环中手动删除了旧的声明,现在一切都正常了
[HttpPost, ValidateAntiForgeryToken]
public async Task<ActionResult> Claims_UpdateByClaimGroup([Bind(Include = "Id,SelectedClaimGroupId")] UserClaimsViewModel viewModel)
{
var claimGroup = await _repository.GetAsync<ClaimGroup>(Convert.ToInt32(viewModel.SelectedClaimGroupId));
User user = await _repository.GetAsync<User>(viewModel.Id);
ApplicationUser appUser = await UserManager.FindByIdAsync(user.AppUser.Id);
// Remove all the old claims
var listToRemove = appUser.Claims.ToArray();
foreach (var item in listToRemove)
{
await UserManager.RemoveClaimAsync(item.UserId, new Claim(item.ClaimType, item.ClaimValue));
}
try
{
// Then add the new claims.
foreach (ClaimGroupItems claimGroupItem in claimGroup.Items)
{
//UserManager.AddClaim(appUser.Id, new Claim(claimGroupItem.MenuItemId.ToString(), claimGroupItem.ClaimValue));
appUser.Claims.Add(new IdentityUserClaim()
{
UserId = appUser.Id,
ClaimType = claimGroupItem.MenuItemId.ToString(),
ClaimValue = claimGroupItem.ClaimValue,
});
}
await UserManager.UpdateAsync(appUser);
}
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
validationErrors.Entry.Entity.GetType().FullName,
validationError.PropertyName,
validationError.ErrorMessage);
}
}
throw; // You can also choose to handle the exception here...
}
return RedirectToAction("Claims", new { id = viewModel.Id, Updated = true });
}
[HttpPost,ValidateAntiForgeryToken]
公共异步任务声明\u UpdateByClaimGroup([Bind(Include=“Id,SelectedClaimGroupId”)]UserClaimsViewModel视图模型)
{
var claimGroup=await_repository.GetAsync(Convert.ToInt32(viewModel.SelectedClaimGroupId));
User=await\u repository.GetAsync(viewModel.Id);
ApplicationUser-appUser=await UserManager.FindByIdAsync(user.appUser.Id);
//删除所有旧的声明
var listToRemove=appUser.Claims.ToArray();
foreach(listToRemove中的var项)
{
等待UserManager.RemoveClaimAsync(item.UserId,新声明(item.ClaimType,item.ClaimValue));
}
尝试
{
//然后添加新的声明。
foreach(claimGroup.Items中的ClaimGroupItems claimGroupItem)
{
//UserManager.AddClaim(appUser.Id,新声明(claimGroupItem.MenuItemId.ToString(),claimGroupItem.ClaimValue));
appUser.Claims.Add(新的IdentityUserClaim()
{
UserId=appUser.Id,
ClaimType=claimGroupItem.MenuItemId.ToString(),
ClaimValue=claimGroupItem.ClaimValue,
});
}
等待UserManager.UpdateAsync(appUser);
}
catch(DbEntityValidationException dbEx)
{
foreach(dbEx.EntityValidationErrors中的var validationErrors)
{
foreach(validationErrors.validationErrors中的var validationError)
{
Trace.TraceInformation(“类:{0},属性:{1},错误:{2}”,
validationErrors.Entry.Entity.GetType().FullName,
validationError.PropertyName,
validationError.ErrorMessage);
}
}
throw;//您也可以选择在此处处理异常。。。
}
返回RedirectToAction(“Claims”,new{id=viewModel.id,Updated=true});
}
…您是否介意将ApplicationUser类放在原始帖子中,以便hep人员更好地理解问题和解决方案。
[HttpPost, ValidateAntiForgeryToken]
public async Task<ActionResult> Claims_UpdateByClaimGroup([Bind(Include = "Id,SelectedClaimGroupId")] UserClaimsViewModel viewModel)
{
var claimGroup = await _repository.GetAsync<ClaimGroup>(Convert.ToInt32(viewModel.SelectedClaimGroupId));
User user = await _repository.GetAsync<User>(viewModel.Id);
ApplicationUser appUser = await UserManager.FindByIdAsync(user.AppUser.Id);
// Remove all the old claims
var listToRemove = appUser.Claims.ToArray();
foreach (var item in listToRemove)
{
await UserManager.RemoveClaimAsync(item.UserId, new Claim(item.ClaimType, item.ClaimValue));
}
try
{
// Then add the new claims.
foreach (ClaimGroupItems claimGroupItem in claimGroup.Items)
{
//UserManager.AddClaim(appUser.Id, new Claim(claimGroupItem.MenuItemId.ToString(), claimGroupItem.ClaimValue));
appUser.Claims.Add(new IdentityUserClaim()
{
UserId = appUser.Id,
ClaimType = claimGroupItem.MenuItemId.ToString(),
ClaimValue = claimGroupItem.ClaimValue,
});
}
await UserManager.UpdateAsync(appUser);
}
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
validationErrors.Entry.Entity.GetType().FullName,
validationError.PropertyName,
validationError.ErrorMessage);
}
}
throw; // You can also choose to handle the exception here...
}
return RedirectToAction("Claims", new { id = viewModel.Id, Updated = true });
}