ASP.NET - 如果角色授权失败,则重定向到错误页面

23

我正在使用带有Forms身份验证的MVC 3。在我的控制器或方法上,我正在执行以下操作:

[Authorize (Roles = "developer")]
在这种情况下,我想检查用户是否已登录,如果没有,则将其返回到登录页面。但是,如果该用户的'IsInRole'检查返回false,则希望将其发送到一个不同的视图,该视图显示类似于“未经授权”的消息。
如何最好地实现这样的功能?我希望避免创建新的授权属性,以便不必重构整个应用程序中的每个授权属性,但如果需要,我会采取这种方法。
3个回答

50

一个自定义授权属性可以重写 HandleUnauthorizedRequest 方法来完成该工作:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            // The user is not authenticated
            base.HandleUnauthorizedRequest(filterContext);
        }
        else if (!this.Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole))
        {
            // The user is not in any of the listed roles => 
            // show the unauthorized view
            filterContext.Result = new ViewResult
            {
                ViewName = "~/Views/Shared/Unauthorized.cshtml"
            };
        }
        else
        { 
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

然后:

[MyAuthorize(Roles = "developer")]
public ActionResult Develop()
{
    ...
}

6
你要把这个自定义实现放在哪里? - Ricker Silva
1
@darin-dimitrov 我们应该把自定义实现放在哪里?有惯例或建议吗? - Vijay Chavda

1
你可以像这样使用它。因为如果你没有权限,它就会返回方法。授权控制并不是必需的。
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            // The user is not authenticated
            base.HandleUnauthorizedRequest(filterContext);
        }
        else
        {
            filterContext.Result = new ViewResult
            {
                ViewName = "~/Views/Shared/Unauthorized.cshtml",
            };
        }
    }

1

您还可以使用自定义错误页面来处理401状态码。

有关实现细节,请参见此问题


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