Проблемы с usermanager в asp net core identity - PullRequest
0 голосов
/ 08 июля 2020

Я пишу приложение для веб-сборки 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");
            });
...