ASP.NET 核心添加和删除角色
ASP.NET CORE Adding and Removing Roles
正如标题所说,如果角色与用户拥有的角色不匹配,我正在尝试从我获得的数组中添加角色。那些确实匹配的我想被删除。这是我的控制器逻辑。
string id 是我得到的角色的名字。
另外,当我 运行 这段代码时,我得到一个异常提示
"用户安全戳不能为空。"
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, User user, string[] roles)
{
if (id != user.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
var listOfRoles = await privateUser.GetRolesAsync(user);
foreach (var role in listOfRoles.Except(roles))
{
await privateUser.RemoveFromRoleAsync(user, role);
}
foreach(var role in roles.Except(listOfRoles))
{
await privateUser.AddToRoleAsync(user, role);
}
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!UserExists(user.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(user);
}
您正在使用通过 POST 获得的用户,这不仅是不好的做法,而且甚至不会在这里工作,因为您没有 post 完整的 User
对象。即,缺少 SecurityStamp
的值,这是异常告诉您的内容。
不要post User
。相反,使用用户 ID 从数据库中获取它:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, string[] roles)
{
var user = await _userManager.FindByIdAsync(id);
if (user == null)
{
return NotFound();
}
// the rest of your code
UPDATE(同时修改用户)
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, User model, string[] roles)
{
var user = await _userManager.FindByIdAsync(id);
if (user == null)
{
return NotFound();
}
// map over the values from `model` (i.e. the posted `User`)
user.FirstName = model.FirstName;
// etc.
// use `user` not `model` for role management functions
正如标题所说,如果角色与用户拥有的角色不匹配,我正在尝试从我获得的数组中添加角色。那些确实匹配的我想被删除。这是我的控制器逻辑。 string id 是我得到的角色的名字。 另外,当我 运行 这段代码时,我得到一个异常提示 "用户安全戳不能为空。"
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, User user, string[] roles)
{
if (id != user.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
var listOfRoles = await privateUser.GetRolesAsync(user);
foreach (var role in listOfRoles.Except(roles))
{
await privateUser.RemoveFromRoleAsync(user, role);
}
foreach(var role in roles.Except(listOfRoles))
{
await privateUser.AddToRoleAsync(user, role);
}
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!UserExists(user.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(user);
}
您正在使用通过 POST 获得的用户,这不仅是不好的做法,而且甚至不会在这里工作,因为您没有 post 完整的 User
对象。即,缺少 SecurityStamp
的值,这是异常告诉您的内容。
不要post User
。相反,使用用户 ID 从数据库中获取它:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, string[] roles)
{
var user = await _userManager.FindByIdAsync(id);
if (user == null)
{
return NotFound();
}
// the rest of your code
UPDATE(同时修改用户)
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, User model, string[] roles)
{
var user = await _userManager.FindByIdAsync(id);
if (user == null)
{
return NotFound();
}
// map over the values from `model` (i.e. the posted `User`)
user.FirstName = model.FirstName;
// etc.
// use `user` not `model` for role management functions