ASP .Net角色 - RemoveUserFromRole - 错误删除角色

时间:2011-12-13 07:07:14

标签: c# asp.net .net roles

给出这段代码......(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'。

鉴于我刚刚获取了用户的角​​色并检查了我想要移除的角色存在,这有点神秘......有什么线索可以让它正常工作?

3 个答案:

答案 0 :(得分:2)

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

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

        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);
                }

            }
        }

答案 1 :(得分:1)

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

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

这是我的类似代码,但我正在循环查看已绑定的角色的复选框列表,并预填充用户已有的所选角色。

MembershipUser user = 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

答案 2 :(得分:0)

答案结果是我们在dbo.aspnet_Roles表上有2个条目用于角色,具有相同的RoleName不同的LoweredRolenames,这似乎导致删除代码无声地失败。