Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 2 重定向结果是如何工作的?_Asp.net Mvc 2_C# 4.0 - Fatal编程技术网

Asp.net mvc 2 重定向结果是如何工作的?

Asp.net mvc 2 重定向结果是如何工作的?,asp.net-mvc-2,c#-4.0,Asp.net Mvc 2,C# 4.0,我目前使用的redirectoroutesult如下: public void OnAuthorization(AuthorizationContext filterContext) { User user = filterContext.HttpContext.Session["user"] as User; if (user == null || user.Role != expectedRole) { filterContext.Result = n

我目前使用的
redirectoroutesult
如下:

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()的调用,并在用户未登录时跳过操作的执行。如果用户未登录,则我希望它重定向到另一个操作


redirectoroutesult
是否将重定向到适当的操作服务器端,而不必通过客户端执行大循环(例如重写窗口URL位置或类似的操作)?它就是这样工作的吗?

否-RedirectXXXResult总是返回HTTP302。这不是Server.Transfer()的等价物。

好吧,我自己已经解决了

所以基本上,我需要的不是“重定向”。我找错了地方来解决我的问题。我知道重定向意味着我必须进行多次客户机/服务器访问才能返回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会话窃取,我就完成了

我希望这将有助于其他人。
谢谢。

您的解决方案不够健壮,会使客户端代码复杂化;更不用说为所有不同类型的客户机维护此代码的开销了

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

注:

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