请求仍然经过身份验证,但会话[“帐户”]在Asp.net MVC中丢失

时间:2015-07-13 00:18:06

标签: asp.net-mvc session authentication

我在我的网站上使用FormsAuthentication和我自己的数据库,在登录功能中,我使用FormsAuthenticate.setAuth()并使用我登录的帐户变量设置Session [“account”]。在布局页面中的某个时候,Request.IsAuthenticated仍然是真的但是Session [“account”]丢失了,导致我引用了空值。我在SO中找到了这个,修复了Global.asax,但它并不总是有效:

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            //Check if user is authenticated
            HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
                if (!authTicket.Expired)
                {
                    try
                    {
                        if (Session["account"] == null)
                        {
                            //Session is null, redirect to login page
                            FormsAuthentication.SignOut();
                            return;
                        }
                    }
                    catch { }
                }
            }
        }

我需要一个更好的解决方案

1 个答案:

答案 0 :(得分:0)

根据您的评论:

I want to display username as a link in a corner of layout, so from any page, user can access to the profile page

我的建议是不要为此目的使用Session。应谨慎使用会话对象,并应尽可能避免使用。首先,它们倾向于使Web应用程序在负载均衡器方案下难以工作。

您可以在User.Identity.Name_Layout.cshtml中使用_LayoutPartial.cshtml,如下所示:

@if (Request.IsAuthenticated)
{
    <div class="clear_both">
        <ul class="headernav1">
            <li><span id="spWelcome">Welcome, </span><span id="username">@Html.Raw(User.Identity.Name)</span>
            </li>
        </ul>
   </div>
}