Атрибут MVC RoleProvider и Authorize - PullRequest
8 голосов
/ 12 января 2011

Я реализовал свой собственный поставщик ролей, и я не использую его по умолчанию. Это работает до такой степени, что он может сказать, когда кто-то должен или не должен иметь возможность просматривать страницу.

Однако может ли он сделать следующее:

  1. Если пользователь не вошел в систему, перенаправить на мою страницу входа
  2. Если пользователь вошел в систему, но не имеет правильной роли, перенаправить на другую страницу

Я не понял, как это сделать с помощью атрибута Authorize, все, что у меня есть:

[Authorize(Roles="Admin")]

В основном мне нужно перенаправить на другую страницу в зависимости от того, какая часть авторизации не пройдена.

Я посмотрел, было ли это что-то в web.config, но ничего очевидного не выскакивает.

Ответы [ 2 ]

11 голосов
/ 12 января 2011

VoodooChild ответил # 1.

Для № 2 -

Что вы можете сделать, это проверить, зарегистрирован ли пользователь на странице входа в систему и показать другое сообщение или совершенно другую страницу (или даже сделать перенаправление на другое действие).

В качестве альтернативы вы можете создать свой собственный атрибут авторизации. Для этого потребуется использовать этот атрибут везде вместо значения по умолчанию AuthorizeAttribute

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            filterContext.Result = new RedirectToRouteResult(
                               new RouteValueDictionary 
                               {
                                   { "action", "ActionName" },
                                   { "controller", "ControllerName" }
                               });
        }
        else
            base.HandleUnauthorizedRequest(filterContext);
    }
}

Обновление:

Просто подумал о другом методе. Когда перенаправление выполняется на страницу login с другой страницы, также передается строка запроса ReturnUrl. Таким образом, вы также можете проверить, содержит ли оно что-то И аутентифицирован ли пользователь, возможно, у пользователя нет разрешения на просмотр этой страницы.

7 голосов
/ 12 января 2011

Сверху головы, если вы используете FormsAuthentication, чтобы ответить на свой первый вопрос - да. Если пользователь не прошел проверку подлинности или не вошел в систему, его можно перенаправить на страницу входа в систему:

Makeуверен, что у вас есть это в файле web.config (не уверен, что если вам что-то нужно, посмотрите на это ..)

<authentication mode="Forms">
  <forms loginUrl="~/AccountController/LogOn" timeout="2880" />
</authentication>

Чтобы ответить на ваш второй вопрос: «Если пользователь вошел в систему, но делаетне иметь правильную роль, перенаправить на другую страницу "

Так, как мы это сделали, мы использовали метод System.Web.Security.Roles.GetRolesForUser(username);, чтобы получить роли, и на основании этого мы перенаправили пользователя в правильное представление, после того, каклогин.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...