【问题标题】:ASP .Net roles - RemoveUserFromRole - error removing roleASP .Net 角色 - RemoveUserFromRole - 删除角色时出错
【发布时间】:2012-01-19 02:36:46
【问题描述】:

鉴于这段代码...(roleuserName 是传入的字符串)

string[] existingRoles = Roles.GetRolesForUser(userName);

foreach (string role in existingRoles)
{
    if (!newRoles.Contains(role))
    {
        Authentication.AuthTraceStatic("Removing user {0} from role: {1}", 
            userName, role);
        Roles.RemoveUserFromRole(userName, role);

    }
}

我收到以下错误:

用户“xxx”已经不在角色“yyy”中。

鉴于我刚刚获取了用户的角​​色并检查了我要删除的角色是否存在,这有点令人费解......有什么线索可以让它正常工作吗?

【问题讨论】:

    标签: c# asp.net .net roles


    【解决方案1】:

    难道不是多线程问题吗?您是否尝试过用锁块包围代码?如果在 foreach 循环中使用 Roles.IsUserInRole(username, role) 检查角色是否存在,会发生什么?

    我会尝试用这样的代码调试它,看看会发生什么。

            string[] existingRoles = Roles.GetRolesForUser(userName);
    
            foreach (string role in existingRoles)
            {
                if (!newRoles.Contains(role))
                {
                    Authentication.AuthTraceStatic("Removing user {0} from role: {1}", userName, role);
                    lock(o)
                    {
                         if(Roles.IsUserInRole(userName, role))
                              Roles.RemoveUserFromRole(userName, role);
                         else
                             Authentication.AuthTraceStatic("Somebody is messing with my roles!!", userName, role);
                    }
    
                }
            }
    

    【讨论】:

      【解决方案2】:

      首先检查您的用户名的上下文。我自己也有同样的问题。有时用户名返回的是当前登录的用户,而不是您尝试删除角色的用户。

      其次,检查以确保您的代码没有删除您不期望的角色。这是我遇到相同错误时遇到的两个问题。还要确保您使用会员资格提供程序来获取会员资格用户对象,然后您可以使用该对象访问用户名。

      这是我的类似代码,但我正在循环一个复选框列表,该列表已经绑定并预填充了用户已经拥有的选定角色。

      MembershipUser 用户 = Membership.GetUser(txtUserName.Text);

                  //Update roles
                  foreach (ListItem role in cbRoles.Items)
                  {
                      if (role.Selected)
                      {
                          //if user is not in role
                          if (!Roles.IsUserInRole(user.UserName,role.Value))
                          {
                              Roles.AddUserToRole(user.UserName, role.Value);
                          }
                      }//role not selected
                      else
                      {
                          //if user is in a role that is no longer selected remove them
                          if (Roles.IsUserInRole(user.UserName, role.Value))
                          {
                              Roles.RemoveUserFromRole(user.UserName, role.Value);
                          }
                      }
                  }
      

      希望这会有所帮助。 GS

      【讨论】:

      • 好的,它适用于大多数角色 - 我发现一个问题角色是已重命名的角色(通​​过 SQL)。使用您的建议,我现在必须“静默失败” - Roles.RemoveUserFromRole 不会失败 - 但角色也没有被删除......
      • 确保您没有使用 Roles.IsUserInRole("[rolename]");您应该使用 Roles.IsUserInRole("[username]","[rolename]");
      【解决方案3】:

      结果证明我们在 dbo.aspnet_Roles 表中有 2 个条目用于该角色,具有相同的 RoleName 不同的 LoweredRolenames,这似乎导致删除代码静默失败。

      【讨论】:

        猜你喜欢
        • 2016-07-28
        • 1970-01-01
        • 2021-10-10
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 2021-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多