ASP.NET核心身份中UserManager的问题

时间:2020-07-08 17:49:34

标签: c# asp.net-core blazor identity

我正在编写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");
            });

0 个答案:

没有答案