给出这段代码......(role
和userName
是传入的字符串)
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'。
鉴于我刚刚获取了用户的角色并检查了我想要移除的角色存在,这有点神秘......有什么线索可以让它正常工作?
答案 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,这似乎导致删除代码无声地失败。