我目前正在使用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类中。

我打算将其用作特定 Controller 操作上的装饰器,例如:
[CheckLogin(RolesEnum.Member, "MyController", "MyAction")]
public JsonResult GetNews()

因此,基本上,我正在尝试缩短对GetNews()的调用,并在用户未登录的情况下跳过该 Action 的执行。如果用户未登录,那么我希望它重定向到另一个操作。
RedirectToRouteResult是否将重定向到适当的操作服务器端,而不必在客户端进行大循环(例如重新编写窗口URL位置之类的东西)?那是怎么回事?

最佳答案

好吧,我已经自己弄清楚了。

因此,基本上,我不需要“重定向”。我在寻找错误的地方来解决我的问题。我知道重定向意味着我必须进行几次客户端/服务器访问才能返回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 session 被窃取,还需要更多代码,我已经完成了。

我希望这会对外面的人有所帮助。
谢谢。

关于asp.net-mvc-2 - RedirectToRouteResult如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3992788/

10-12 04:06