【问题标题】:Continues to execute MVC-controller after FormsAuthentication.SignOut()在 FormsAuthentication.SignOut() 之后继续执行 MVC-controller
【发布时间】:2011-10-28 02:25:46
【问题描述】:

我将所有会话保存在数据库中。让我们假设这个会话丢失在数据库中,而不是在 cookie 中。

在 OnAuthorization(AuthorizationContext filterContext) 中,我根据会话 ID 从数据库中检索用户对象。

if (HttpContext.User.Identity.IsAuthenticated)
{
    //Gets user data from DB.
    var user = userRepos.GetUser(HttpContext.User.Identity.Name); 

        if (user != null)
        {
            CurrentUser = user;
            Thread.CurrentPrincipal = HttpContext.User = new DibPrincipal(user);
            return;
        }
        else
        {
            FormsAuthentication.SignOut();
            Session.Abandon();
            Response.Redirect(FormsAuthentication.LoginUrl, true);
        }
    }
}

假设用户调用了控制器 GetDocuments,但他被重定向到 FormsAuthentication.LoginUrl。它工作,用户被重定向,但我得到一个异常,它在 GetDocument 控制器中显示错误,因为 CurrentUser 不存在。所以 .net 尝试在重定向后调用 GetDocuments。

如何避免这个错误?

谢谢! :)

【问题讨论】:

    标签: .net model-view-controller session authentication controller


    【解决方案1】:

    你不应该从你的 OnAuthorization 函数重定向,而应该从 filterContext 中设置 Result 参数:

    filterContext.Result == new RedirectToRouteResult(new RouteValueDictionary {
    {
        "controller",
        "Utilisateurs"
    },
    {
        "action",
        "Connexion"
    },
    {
        "ReturnUrl",
        filterContext.HttpContext.Request.RawUrl
    }
    });
    

    【讨论】:

    • 效果很好!谢谢你。但是为什么使用来自 OnAuthorization 的重定向是不对的。这两种方法有什么区别?
    • 因为您不应该直接自己管理重定向,而是向 mvc 指示您要重定向,因此允许它正确管理重定向。您的“Response.Redirect”有点像在中间停止进程。
    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多