c# – 如何使Authorize属性返回自定义403错误页,而不是重定向到登录页面

[授权]属性是好的和方便的MS发明,我希望它可以解决我现在的问题

具体来说:

当当前客户端没有验证 – [授权]重定向从安全操作到登录页面和登录成功后 – 带回用户回来,这是好的。

但是,当前客户端已经验证,但没有授权运行特定的操作 – 我所需要的只是显示我的一般403页。

是否可能不移动控制器体内的授权逻辑?

更新:
我需要的行为应该在语义上等于这个草图:

public ActionResult DoWork()
{
    if (!NotAuthorized())
    {
        // this should be not redirect, but forwarding 
        return RedirectToAction("403");         
    }

    return View();
}

所以 – 应该没有任何重定向和url应该保持不变,但页面的内容应该替换为403页

更新2:我这样实现草图:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    [CustomActionFilter]
    public ActionResult About()
    {
        return View();
    }

    public ActionResult Error_403()
    {
        return Content("403");
    }
}

public class CustomActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Result = new ContentResult { Content = "403" };
    }
}

并且不能得到如何正确地转发执行到HomeController.Action_403(),所以它显示403。

更新3:

filterContext.Result = new ViewResult() { ViewName = "Error_403" };

所以这是一个如何渲染特定视图模板…但仍然不知道如何运行另一个控制器的答案 – 反正,它是足够好的解决方案。

最佳答案
您应该能够创建自己的类,从AuthorizeAttribute派生,并重写AuthorizeCore方法,以提供所需的授权机制,以便您可以通过使用属性,而不是将其移动到控制器中应用您的自定义授权代码。

如果您需要对授权进行更细致的控制,那么我建议您创建一个IActionFilter接口的实现(在属性上,然后将属性应用于您的方法)。这将允许您在呼叫前转到控制器,并在调用控制器方法之前提供备用操作。

这是通过在IActionFilter接口上实现OnActionExecuting method来实现的。如果你的逻辑确定你根本不应该打电话给控制器,而你想提供一个ActionResult来处理,那么你将ActionExecutingContext上的Result property实例传递给方法。通过这样做,该ActionResult被处理,而不是去控制器方法以获得ActionResult。

如果你想返回403错误代码,那么你不能使用ContentResult类。你必须创建自己的类,从ActionResult派生,并重写ExecuteResult方法设置StatusCode propertyHttpResponseBase到403,像这样:

internal class Http403Result : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        // Set the response code to 403.
        context.HttpContext.Response.StatusCode = 403;
    }
}

public class CustomActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Result = new Http403Result();
    }
}

当然,你可以推广Http403Result类来接受一个构造函数,它将接受你想要返回的状态代码,但是概念保持不变。

转载注明原文:c# – 如何使Authorize属性返回自定义403错误页,而不是重定向到登录页面 - 代码日志