我在_layout模板中有一些链接(登录,注销和注册),根据用户是否登录显示链接。如下所示:
if (User.Identity.IsAuthenticated)
{
<span class="username">@User.Identity.Name</span>
<span class="link">@Html.ActionLink("Logout", "Logout", "Account")</span>
}
else
{
<span class="link">@Html.ActionLink("Login", "Login", "Account")</span>
<span class="link">@Html.ActionLink("Register", "Register", "Account")</span>
}
问题是当用户第一次退出系统时仍会显示注销链接(我希望立即用登录名替换,并注册链接) - 直到刷新页面,或者用户移动到另一个页面。这是注销操作代码:
public ActionResult Logout()
{
FormsAuthentication.SignOut();
Session.Abandon();
return View();
}
我已经完成了这个链接 - http://mvcdev.com/differences-between-asp-net-razor-and-web-forms-view-engines/ - 它解释了Razor引擎的执行顺序,但在我的情况下它似乎执行不同。理想情况下,我希望FormsAuthentication.SignOut()在_layout中的User.Identity.IsAuthenticated之前执行。
我做错了什么?谢谢!
答案 0 :(得分:3)
这是正常的,您需要在注销后重定向:
public ActionResult Logout()
{
FormsAuthentication.SignOut();
Session.Abandon();
return RedirectToAction("Index");
}
发生这种情况的原因是,当客户端请求Logout链接时,他仍然经过身份验证(他发送了身份验证cookie以及请求)。然后在控制器操作中,您将其注销(FormsAuthentication.SignOut()
),这只会在后续请求上标记要删除的身份验证Cookie。然后你返回一个视图,当然在这个视图中,用户仍然被认证,因为这个视图在同一个请求下执行,并且cookie仍然存在。