在FormsAuthentication.SignOut()之后继续执行MVC控制器

时间:2011-08-16 13:56:10

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

我将所有会话保存在数据库中。让我们想象一下,这个会话在数据库中丢失了,而不是在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。

如何避免此错误?

谢谢! :)

1 个答案:

答案 0 :(得分:1)

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

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