#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
методу. Я думаю, это решит вашу проблему.