我正在编写Blazor Webassembly应用程序,但我不认为这是Blazor问题,很可能是我缺乏使用ASP Net Core的经验。 我正在尝试更新用户数据,并在控制器中具有添加或更新用户的功能。 在我的控制器中,我进行如下注入:
// Assign the object in the constructor for dependency injection
public ApplicationUserController(TTPlannerDbContext context, IMapper mapper, UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)
{
_context = context;
_mapper = mapper;
_userManager = userManager;
_signInManager = signInManager;
}
当我更新用户时,我可以使其工作,但某些功能似乎不起作用。 addupdate是这样的:
[HttpPost]
[Route("AddUpdateUser")]
public async Task<ActionResult<ApplicationUserDTO>> AddUpdateUser(ApplicationUserDTO sentUser)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// Get the logged in user.
// This line should work but doesnt and I dont know why.
// ApplicationUser loggedinUser = await _userManager.GetUserAsync(User).ConfigureAwait(false); <<<***
string loggedinUserId = User.FindFirstValue(ClaimTypes.NameIdentifier);
ApplicationUser loggedinUser = _context.Users.Find(loggedinUserId);
IList<string> roles = await _userManager.GetRolesAsync(loggedinUser);
if (roles.Contains(AllowedRoles.administrator.ToString()) ||
(sentUser.Id == loggedinUser.Id)) // If the logged in user is an admin or the person edited then allow the update
{
ApplicationUser foundUser = _context.Users.Find(sentUser.Id);
if (foundUser != null)
{
_mapper.Map(sentUser, foundUser);
var saveresult = await _context.SaveChangesAsync();
// Update the roles
IList<string> availableroles = (IList<string>)Enum.GetNames(typeof(AllowedRoles));
// First remove from all
await _userManager.RemoveFromRolesAsync(foundUser,availableroles);
//Then add back
await _userManager.AddToRolesAsync(foundUser, sentUser.Roles);
// This works fine....
//foreach (string role in sentUser.Roles)
//{
// if (!roles.Contains(role))
// {
// await _userManager.AddToRoleAsync(foundUser, role);
// }
//}
if (saveresult ==1)
{
return Ok(sentUser);
}
}
}
return Ok(sentUser);
}
第一个无效的功能是:
ApplicationUser loggedinUser = await _userManager.GetUserAsync(User).ConfigureAwait(false);
这仅返回null。 我使用以下方法解决了这个问题:
string loggedinUserId = User.FindFirstValue(ClaimTypes.NameIdentifier);
ApplicationUser loggedinUser = _context.Users.Find(loggedinUserId);
哪个工作正常...
然后我要更新用户,基本更新工作正常,但角色更新没有。
// This works fine....
//foreach (string role in sentUser.Roles)
//{
// if (!roles.Contains(role))
// {
// await _userManager.AddToRoleAsync(foundUser, role);
// }
//}
但是,我还需要删除已删除的角色。所以我以为我会打电话给
await _userManager.RemoveFromRolesAsync(foundUser,availableroles);
删除所有角色并重新添加。也许不是最有效的方法,但不是经常执行,并且感觉更干净。 这不起作用,addtoroles也不起作用。 我觉得我缺少什么。我还需要在启动或注入中注册用户管理器的某些附加或扩展吗?还是我想念其他东西?
我处理用户管理器的startup.cs代码如下:
在configureservices中,我有:
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, TTPlannerDbContext>(options => {
options.IdentityResources["openid"].UserClaims.Add("name");
options.ApiResources.Single().UserClaims.Add("name");
options.IdentityResources["openid"].UserClaims.Add("role");
options.ApiResources.Single().UserClaims.Add("role");
});