Roles.IsUserInRole ведет себя так, как ожидается в следующем простом сценарии? - PullRequest
3 голосов
/ 12 декабря 2008

В пользовательском поставщике ролей (унаследованном от RoleProvider) в .NET 2.0 метод IsUserInRole жестко закодирован и всегда возвращает true:

public override bool IsUserInRole(string username, string roleName) { return true; }

В приложении ASP.NET, настроенном для использования этого поставщика ролей, следующий код возвращает значение true (как и ожидалось):

Roles.IsUserInRole("any username", "any rolename"); // results in true

Однако следующий код возвращает false:

Roles.IsUserInRole("any rolename"); // results in false

Обратите внимание, что User.IsInRole ("any rolename") также возвращает false.

  1. Это ожидаемое поведение?
  2. Неправильно ли считать, что перегрузка, которая принимает только имя роли, все равно будет вызывать переопределенную IsUserInRole?

Обновление : обратите внимание, что не существует переопределения, доступного для версии, которая принимает одну строку, что привело к моему предположению в # 2.

Ответы [ 3 ]

3 голосов
/ 12 декабря 2008

Я посмотрел на Roles.IsUserInRole (строка rolename) в отражателе .net, и он разрешается следующим образом:

public static bool IsUserInRole(string roleName)
{
    return IsUserInRole(GetCurrentUserName(), roleName);
}

Я бы посмотрел на вашего текущего пользователя. И вот почему:

private static string GetCurrentUserName()
{
    IPrincipal currentUser = GetCurrentUser();
    if ((currentUser != null) && (currentUser.Identity != null))
    {
        return currentUser.Identity.Name;
    }
    return string.Empty;
}

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

В методе IsUserInRole(string username, string roleName) рядом с началом есть следующий блок кода:

   if (username.Length < 1)
   {
       return false;
   }

Если ваш GetCurrentUserName() не вернет ничего значащего, он вернет false, прежде чем вызовет ваш переопределенный метод.

Мораль, от которой нужно отказаться: Отражатель - отличный инструмент:)

0 голосов
/ 25 марта 2010

Это может кому-то помочь - знайте:

Если вы используете для аутентификации элемент управления login - имя пользователя, введенное в элемент управления, становится HttpContext.Current.User.Identity.Name, которое используется в Roles.IsUserInRole (строка rolename) и, более конкретно, - GetUser членства ( ) метод. Поэтому, если это так, убедитесь, что вы переопределили событие Authenticate, подтвердите пользователя в этом методе и установите для имени пользователя значение, которое может использовать ваш пользовательский поставщик членства.

 protected void crtlLoginUserLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
    bool blnAuthenticate = false;
    string strUserName = crtlLoginUserLogin.UserName;

    if (IsValidEmail(strUserName))
    {

        //if more than one user has email address - must authenticate by username.

        MembershipUserCollection users = Membership.FindUsersByEmail(strUserName);
        if (users.Count > 1)
        {
            crtlLoginUserLogin.FailureText = "We are unable to determine which account is registered to that email address. Please enter your Username to login.";

        }
        else
        {
            strUserName = Membership.GetUserNameByEmail(strUserName);
            blnAuthenticate = Membership.ValidateUser(strUserName, crtlLoginUserLogin.Password);

            //setting the userLogin to the correct user name (only on successful authentication)
            if (blnAuthenticate)
            {
                crtlLoginUserLogin.UserName = strUserName;
            }

        }


    }
    else
    {
        blnAuthenticate = Membership.ValidateUser(strUserName, crtlLoginUserLogin.Password);
    }

    e.Authenticated = blnAuthenticate;

}
0 голосов
/ 07 декабря 2009

Также будьте осторожны, если вы выбрали cacheRolesInCookie = "true" в конфигурации RoleManager. Если вы добавили новую роль в базу данных, возможно, она ищет кэшированную версию в файле cookie.

У меня была эта проблема, и решением было удалить cookie и заново войти в систему.

...