ASP.NET MVC 5如何处理未经授权的请求?

3

我正在尝试在一个新的ASP.NET MVC 5项目中实现访问被拒绝的错误页面,该项目使用单独用户账户认证模式。 我添加了一个CustomAuthorize类,它继承自AuthorizeAttribute

public class CustomAuthorize : AuthorizeAttribute
{
    protected virtual CustomPrincipal CurrentUser
    {
        get { return HttpContext.Current.User as CustomPrincipal; }
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            if (!string.IsNullOrEmpty(Roles))
            {
                if (!CurrentUser.IsInRole(Roles))
                {
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary(new { controller = "Error", action = "AccessDenied" }));

                    //base.OnAuthorization(filterContext); // returns to login url
                }
            }

            if (!string.IsNullOrEmpty(Users))
            {
                if (!Users.Contains(CurrentUser.UserName))
                {
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary(new { controller = "Error", action = "AccessDenied" }));

                    //base.OnAuthorization(filterContext); // returns to login url
                }
            }
        }
    }


    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" }));
        }
    }
}

添加 ErrorController.cs

public class ErrorController : Controller
{
    public ActionResult AccessDenied()
    {
        return View();
    }
}

还有AccessDenied.cshtml视图

<h2>Access Denied</h2>
<p>You do not have access to view this page</p>

然后应用于HomeController.cs

[CustomAuthorize]
public class HomeController : Controller

然而它总是重定向到登录页面。如何显示访问被拒绝的页面?


它是否也会将已授权的用户重定向到登录页面? - takemyoxygen
@takemyoxygen 是的,它可以,但我需要重定向到拒绝访问页面。 - Willy
我可以确认您的CustomAuthorize或Error控制器没有问题,因为我已经在带有个人用户账户的mvc 5模板中进行了测试。请查看我的回答。 - DSR
1个回答

1

创建一个带有个人用户账户的 MVC 5 项目,添加您的错误控制器、视图和 CustomAuthorize 属性类。

然后按照以下方式更新 Home 控制器。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [CustomAuthorize(Roles = "TestRole")]
    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";

        return View();
    }
}

注册并登录后,尝试点击“关于”链接,您将被重定向到访问被拒绝页面,因为没有具有“TestRole”角色的用户。


1
抱歉,我忘记在CustomAuthorize类上添加"OnAuthorization"方法了。如果存在此方法,则永远不会到达"HandleUnauthorizedRequest"。 - Willy
是的,你说得对,你必须在OnAuthorization内部处理它。你可能需要将状态码更改为401。 - DSR
你能展示一下如何在 OnAuthorization 中处理吗?为什么它从未到达 HandleUnauthorizedRequest - Willy
似乎首先调用OnAuthorization()和IsAuthorized(),然后才调用HandleUnauthorizedRequest(),因此我们必须以这种方式处理它。https://dev59.com/pmcs5IYBdhLWcg3wtmSf - DSR

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