Подтвердить что ты не робот

ASP.Net MVC 3 Перенаправление UnAuthorized User not to loginUrl

У меня есть проект с использованием ASP.Net MVC3 и использование членства для ролей. Я использую авторизацию в каждом контроллере. например:

[Authorize(Roles = "Administrator")]
    public ActionResult Index(string q, int i)
    {
      return View(model);
    }

если кто-то не имеет роли для администратора, то он по умолчанию перенаправляется на страницу входа в систему. как изменить его, чтобы он перенаправлялся в Views/Shared/UnAuthorize.cshtml? или, возможно, если у кого-то нет роли для администратора, появится окно сообщения (предупреждение)?

Заранее спасибо.

4b9b3361

Ответ 1

Просто измените страницу, которая должна отображаться в файле web.config(убедитесь, что маршрут существует)

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

Если вы вместо этого хотите перенаправить на определенный путь для каждой роли, вы можете расширить AuthorizeAttribute своим собственным. Что-то вроде этого (не проверено, я пишу это, чтобы дать вам представление)

public class CheckAuthorize : ActionFilterAttribute
{
  public Roles[] Roles { get; set; }
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    //Your code to get the user
    var user = ((ControllerBase)filterContext.Controller).GetUser();

    if (user != null)
    {
      foreach (Role role in Roles)
      {
        if (role == user.Role)
          return;
      }
    }      
    RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
    if user.Role==Role.Administrator
    {
      redirectTargetDictionary.Add("action", "Unauthorized");
      redirectTargetDictionary.Add("controller", "Home");
    }
    else
    {
      redirectTargetDictionary.Add("action", "Logon");
      redirectTargetDictionary.Add("controller", "Home");
    }
    filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
  }
}

Ответ 2

Я решил свою проблему. Я только делаю это:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

public class MyAuthorize : AuthorizeAttribute
{
   protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
   {
     //you can change to any controller or html page.
     filterContext.Result = new RedirectResult("/cpanel/roles/unauthorize");

   }
 }

и примените MyAuthorize к классу или действию:

[MyAuthorize]
public class AdminController :Controller
{
}

thats it.

Ответ 3

Ну, вы можете наследовать от AuthorizeAttribute и переопределить HandleUnauthorizedRequest, который отвечает за перенаправление несанкционированных/неавторизованных запросов. я думаю, этот вопрос будет вам полезен

Ответ 4

Моя собственная версия, основанная на ntep vodka's:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if(IsUserAuthenticated(filterContext.HttpContext)) 
        {
            filterContext.Result = new RedirectResult("/Account/InvalidRole");
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }

    private bool IsUserAuthenticated(HttpContextBase context)
    {
        return context.User != null && context.User.Identity != null && context.User.Identity.IsAuthenticated;
    }
}

Таким образом, я получаю стандартное перенаправление на страницу входа для не прошедших проверку подлинности пользователей и настраиваемый переадресацию для пользователей, которые прошли аутентификацию, но не имеют соответствующей роли для действия.

Ответ 5

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

Защита Asp.net MVC3

Измените свой маршрут по умолчанию на страницу входа в global.asax

Ответ 6

Код ниже помог, и вот ссылка в stackoverflow ASP.NET MVC 4 custom Authorize attribute - Как перенаправить неавторизованных пользователей на страницу с ошибкой?

public class CustomAuthorize: AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if(!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
        else
        {
            filterContext.Result = new RedirectToRouteResult(new
            RouteValueDictionary(new{ controller = "Error", action = "AccessDenied" }));
        }
    }
}