RedirectToRouteResult如何工作?

时间:2010-10-21 23:24:53

标签: asp.net-mvc-2 c#-4.0

我目前正在使用RedirectToRouteResult,如下所示:

public void OnAuthorization(AuthorizationContext filterContext)
{
    User user = filterContext.HttpContext.Session["user"] as User;
    if (user == null || user.Role != expectedRole)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary {
                {"controller", _controller}, {"action", _action}
        });
    }
}

此代码位于我的CheckLoginAttribute课程中。

我打算将它用作特定控制器操作的装饰器,例如:

[CheckLogin(RolesEnum.Member, "MyController", "MyAction")]
public JsonResult GetNews()

基本上,我正在尝试将对GetNews()的调用短路,并在用户未登录时跳过执行操作。如果用户未登录,那么我希望它重定向到另一个操作。

RedirectToRouteResult是否会重定向到相应的操作服务器端,而无需通过客户端进行大循环(如重写窗口URL位置或类似的东西)?那是怎么回事?

3 个答案:

答案 0 :(得分:4)

好吧,我已经把它弄清楚了。

所以基本上,它不是我需要的“重定向”。我正在寻找错误的地方来解决我的问题。我知道重定向意味着我必须进行几次客户端/服务器之旅才能返回json结果并且感觉不对。

我花了一段时间才意识到我可以将任何类型的结果传递给filterContext.Result。

这是我的错。我没有问正确的问题,因为我没有完全理解我面临的问题。经过大量研究后,归结为非常愚蠢。

最终解决方案是:

    public class CheckLoginAttribute : AuthorizeAttribute, IAuthorizationFilter
{

    private RolesEnum expectedRole;

    public CheckLoginAttribute(RolesEnum role)
    {
        expectedRole = role;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        User user = filterContext.HttpContext.Session["user"] as User;
        if (user == null || user.Role != expectedRole)
        {
            filterContext.Result = new JsonResult()
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new LoginMessage() { IsValidLogin = false }
            };
        }
    }
}

现在我可以用这个来装饰我的动作方法:

[CheckLogin(RolesEnum.Admin)]

一些代码可以避免ASP.NET会话窃取,我已经完成了。

我希望这能帮助那里的人。 感谢。

答案 1 :(得分:1)

否 - RedirectXXXResult始终返回 HTTP 302 。这相当于Server.Transfer()。

答案 2 :(得分:0)

您的解决方案不健全并使客户端代码变得复杂;更不用说为所有不同类型的客户端维护此代码的开销。

通过返回JSON,响应状态代码将为200.这意味着您需要为每个客户端添加安全逻辑,以解释每个响应以检测未经授权的访问。 使用授权过滤器。

http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx

注:

“如果未经授权的用户尝试访问使用Authorize属性标记的方法,则MVC框架将返回401 HTTP状态代码。如果该站点配置为使用ASP.NET窗体身份验证,则401状态代码将导致浏览器将用户重定向到登录页面。“