我在我的网站上使用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 { }
}
}
}
我需要更好的解决方案
根据您的评论:
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>
}