ASP.Net MVC 3:将未授权的用户重定向到登录网址

18

我有一个使用ASP.Net MVC3的项目,并且使用成员资格来管理角色。我在每个控制器中都使用“authorize”。 例如:

[Authorize(Roles = "Administrator")]
    public ActionResult Index(string q, int i)
    {
      return View(model);
    }
如果某人没有管理员角色,则默认情况下会重定向到登录页面。如何更改它,使其重定向到 Views/Shared/UnAuthorize.cshtml?或者如果某人没有管理员角色,它会显示消息框(警报)吗?
提前感谢。
6个回答

24

我解决了我的问题。我只是这样做:

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
{
}

就是这样。


12

只需更改 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
此解决方案将导致未经身份验证和未经授权的请求重定向到未经授权页面。 - Muhammad Adeel Zahid

3

你可以继承AuthorizeAttribute并重写HandleUnauthorizedRequest,它负责重定向未经授权/未经身份验证的请求。我认为这个问题对你有帮助。


我所提到的问题包含示例代码。如果有问题,请告诉我。 - Muhammad Adeel Zahid

1

基于 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;
    }
}

这样,未经身份验证的用户将获得标准重定向到登录页面,而对于已经进行身份验证但没有适当角色执行该操作的用户,则会获得自定义重定向。

1
下面的代码很有用,这里是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" }));
        }
    }
}

0

我使用这种方法,它非常容易实现。

保护Asp.net MVC3

在global.asax中将默认路由更改为登录页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接