Я пишу приложение для веб-сборки Blazor, но не думаю, что это проблема Blazor, скорее всего, из-за отсутствия опыта работы с ядром asp net. Я пытаюсь обновить данные пользователей, и в моем контроллере есть функция для добавления или обновления пользователя. В своем контроллере я ввожу следующее:
// 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);
Что отлично работает ...
Затем мне нужно обновить пользователя, и обновление basi c работает нормально, но обновление роли не работает.
// 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, который обрабатывает usermanager, выглядит следующим образом:
В 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");
});