Ограничить доступ к сайту для определенной роли

У меня 3 роли: Registered Users, Approved Users, and Admins.
Доступ к сайту есть только у Approved users и Admins.

Чтобы ограничить анонимный доступ, я добавил фильтр в FilterConfig следующим образом:

filters.Add(new System.Web.Mvc.AuthorizeAttribute());   

Теперь я хочу, чтобы зарегистрированные пользователи перенаправлялись на целевую страницу со словами:

Пожалуйста, свяжитесь с одним из администраторов, чтобы утвердить вас.

Я не совсем уверен, как правильно это сделать.
Я могу настроить атрибут авторизации на каждом из контроллеров, но я не уверен, что это хороший способ.
Кроме того, я не уверен где я должен указать действие перенаправления по умолчанию в зависимости от роли.
Я знаю, что могу указать действие перенаправления по умолчанию в RouteConfig.cs, но не знаю, где указать роль.


person user194076    schedule 10.03.2013    source источник
comment
Мне не совсем понятно, что вы хотите. Вы хотите разрешить доступ к странице аутентифицированным пользователям, но перенаправить других для входа? Вы хотите предоставить доступ к странице авторизованным пользователям, но не аутентифицированным пользователям, у которых нет соответствующей роли?   -  person Dave Alperovich    schedule 11.03.2013
comment
@DaveA, если пользователь анонимный, показать только логин, если пользователь зарегистрирован, показать целевую страницу, для всех остальных ролей показать полный веб-сайт   -  person user194076    schedule 11.03.2013
comment
Хорошо, я наполовину понимаю. Если пользователь аутентифицирован, разрешите доступ, в противном случае перенаправьте на вход. А вот в остальном немного запутанно. Другие роли? Кроме чего?   -  person Dave Alperovich    schedule 11.03.2013
comment
@DaveA, извините за неясность. Что я хочу сделать, так это: если пользователь регистрируется на веб-сайте, я хочу, чтобы он сначала был одобрен администраторами, прежде чем он сможет использовать сайт. Администраторы могут установить соответствующую ApprovedRole для любого из зарегистрированных пользователей. Имеет ли это смысл?   -  person user194076    schedule 11.03.2013
comment
Яснее. поясните рабочий процесс. Я новый пользователь, который зарегистрировался. Что происходит оттуда. Меня перенаправляют на информационную страницу, пока я не получу подходящую роль?   -  person Dave Alperovich    schedule 11.03.2013
comment
см. мой ответ. Это то, что вы ищите?   -  person Dave Alperovich    schedule 12.03.2013


Ответы (2)


StanK прав в том, что наличие атрибута [Authorize] будет перенаправлять всех пользователей, которые не вошли в систему, на страницу входа. Это половина твоей дилеммы.

Оттуда вам нужно изменить свой метод logon, чтобы проверить, имеет ли только что вошедший в систему пользователь правильную роль (например, ConfirmedUser). Это сложно, потому что User.IsInRole("ConfirmedUser") всегда будет ложным в вашем методе logon. Это связано с тем, что объект User заполняется объектом http, который не будет повторно заполняться до следующего повторного цикла. К счастью, вы можете использовать Roles.IsUserInRole(userName, "ConfirmedUser"), чтобы проверить, есть ли у пользователя правильная роль.

Итак, в вашем методе входа в систему после аутентификации пользователя выйдите из системы и перенаправьте их на метод [AllowAnonymous], который информирует их о том, что они еще не подтверждены.

if (Roles.IsUserInRole(userName, "ConfirmedUser")
{
                FormsAuthentication.SignOut();
                return RedirectToAction("WarningMsg", "Home");

}
person Dave Alperovich    schedule 12.03.2013
comment
Извините, мне потребовалось некоторое время, чтобы попробовать это, но это отлично работает. Большое спасибо за Вашу помощь!!! - person user194076; 18.03.2013
comment
Рад, что смог помочь. Как ни странно, просматривая свой код, я сделал ошибку. Оператор if должен проверять, что у пользователя НЕТ роли -- (!Roles.IsUserInRole(userName, ConfirmedUser)). Но я думаю, вы сами пришли к правильному выводу :) - person Dave Alperovich; 18.03.2013

Для этого вы должны иметь возможность использовать атрибуты [Authorize].

Страницы с ограниченным доступом будут иметь свой контроллер или действие, украшенное [Authorize(Roles="Approved User,Admin")], «целевая страница» для зарегистрированных пользователей будет иметь [Authorize(Roles="Registered User,Approved User,Admin")], а действие «Вход в систему» ​​будет иметь [AllowAnonymous].

Если пользователь не авторизован, он будет перенаправлен на Account/Login. Вам нужно будет создать некоторую логику в этом действии, которое перенаправляет «Зарегистрированных пользователей», которые уже вошли на вашу целевую страницу. Другие должны просто видеть стандартную страницу входа.

ИЗМЕНИТЬ

Логика перенаправления «Зарегистрированных пользователей» со страницы входа на целевую страницу будет выглядеть примерно так:

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{

    if (User.Identity.IsAuthenticated && Roles.IsUserInRole("Registered User"))
        return RedirectToAction("LandingPage");

    ViewBag.ReturnUrl = returnUrl;
    return View();
}
person StanK    schedule 10.03.2013
comment
В этом действии вам нужно будет создать некоторую логику, которая перенаправляет зарегистрированных пользователей, которые уже вошли в систему, на вашу целевую страницу. Я думаю, что это та часть, с которой ОП борется. - person Dave Alperovich; 11.03.2013