Роли ASP .Net - RemoveUserFromRole - ошибка удаления роли - PullRequest
2 голосов
/ 13 декабря 2011

Учитывая этот бит кода ... (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'.

Что несколько загадочно, учитывая, что я только что выбрал роли пользователя и проверил, существует ли та, которую я хочу удалить ... Какие-нибудь подсказки, что нужно сделать, чтобы это работало правильно?

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Разве это не проблема многопоточности? Вы пытались окружить код блоком блокировки? Что произойдет, если вы проверите наличие роли с помощью Roles.IsUserInRole (имя пользователя, роль) внутри цикла foreach?

Я бы попробовал отладить его с помощью такого кода, посмотрим, что получится.

        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 голос
/ 13 декабря 2011

Сначала проверьте контекст вашего имени пользователя. У меня была такая же проблема сама. Иногда имя пользователя возвращает текущего вошедшего в систему пользователя, а не пользователя, для которого вы пытаетесь удалить роли.

Во-вторых, убедитесь, что ваш код не удаляет роли там, где вы этого не ожидаете. Вот две проблемы, которые у меня возникли, когда я получил ту же ошибку. Также убедитесь, что вы используете поставщика членства, чтобы получить объект пользователя членства, который затем можно использовать для доступа к имени пользователя.

Вот мой похожий код, но я просматривал список ролей, которые уже были связаны и предварительно заполнены выбранными ролями, которые уже есть у пользователя.

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

0 голосов
/ 14 декабря 2011

Ответ оказался таким: у нас было 2 записи в таблице dbo.aspnet_Roles для роли с тем же RoleName, другим LoweredRolenames, что, по-видимому, приводит к молчаливому сбою кода удаления.

...