Роли.GetRolesForUser всегда принимает admin в качестве имени пользователя

#c# #asp.net-mvc-4 #admin #membership-provider #roleprovider

#c# #asp.net-mvc-4 #администратор #поставщик членства #roleprovider

Вопрос:

У меня есть следующий код в контроллере для проверки входа:

 SecurityProvider securityProvider = new SecurityProvider();
if (securityProvider.ValidateUser(UserName, Password))
{
    FormsAuthentication.SetAuthCookie(UserName.ToString(), false);
    if (Roles.IsUserInRole("admin"))
    {
        return RedirectToAction("Dashboard", "Admin");
    }
    else
    {
        return RedirectToAction("Dashboard", "User");
    }
}
  

У меня есть пользовательские классы поставщика членства и поставщика ролей. Итак, следующий метод вызывается внутри Roles.IsUserInRole("admin")

 public override string[] GetRolesForUser(string username)
{
    List<string> currentUserRoles = new List<string>();
    using (myDBEntities db = new myDBEntities())
    {
        currentUserRoles.Add(db.Users.First(m => m.UserName == username).Role);
    }
    return currentUserRoles.ToArray();
}
  

Но каким бы ни было имя пользователя, которое я пытаюсь использовать, имя пользователя, которое приходит к этому методу, — «admin». В проекте нет следов явной настройки имени пользователя как «admin». Я что-то упускаю?

Редактировать:

User.Identity.Name всегда возвращает «admin»

Комментарии:

1. хм, если вы всегда проверяете с помощью Roles.IsUserInRole("admin") , вполне логично, что у вас всегда есть «admin» в качестве имени пользователя в вашем методе. Не могли бы вы показать, как вы вызываете GetRolesForUser() ?

2. Я не вызываю метод GetRolesForUser явно. Но когда я отлаживаю роли. IsUserInRole («администратор»), это приводит меня к методу GetRolesForUser.

3. @KrishnaSarma — Используйте роли. Вместо этого используется userinrole(имя пользователя, RoleName). Смотрите мой ответ ниже для получения дополнительной информации.

Ответ №1:

Вы должны вызывать следующий перегруженный метод в Roles :

 Roles.IsUserInRole(userName, roleName);
  

Видите разницу, мы здесь передаем имя пользователя. И это в конечном итоге будет передано вашему GetRolesForUser методу. Я думаю, это решит вашу проблему.