ASP.Net MVC 3 перенаправляет неавторизованного пользователя не в loginUrl
У меня есть проект, использующий ASP.Net MVC3 и использование членства для ролей. я использую authorize в каждом контроллере. например:
[Authorize(Roles = "Administrator")]
public ActionResult Index(string q, int i)
{
return View(model);
}
если у кого-то нет роли администратора, то он будет перенаправлен на страницу входа по умолчанию. как изменить его, чтобы он перенаправлялся в Views/Shared / UnAuthorize.cshtml по ? или, может быть, если у кого-то нет роли администратора, он покажет окно сообщения (предупреждение) ?
спасибо заранее.
6 ответов
просто измените страницу, которая должна быть показана в интернете.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);
}
}
Я решил свою проблему. я делаю только это :
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
{
}
вот и все.
Ну, вы можете наследовать от AuthorizeAttribute
и переопределить HandleUnauthorizedRequest
который отвечает за перенаправление неаугорированных / неавторизованных запросов. я думаю этот вопрос будет полезно для вас
моя собственная версия, основанная на ntep vodka:
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;
}
}
таким образом, я получаю стандартное перенаправление на страницу входа для не прошедших проверку подлинности пользователей и пользовательское перенаправление для пользователей, которые прошли проверку подлинности, но не имеют соответствующей роли для действия.
код ниже помог, и вот ссылка в stackoverflow ASP.NET пользовательский атрибут авторизации MVC 4 - как перенаправить неавторизованных пользователей на страницу ошибок?
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" }));
}
}
}
Я использую этот метод, и это очень легко реализовать.
измените маршрут по умолчанию на страницу входа в систему в global.асакс