对此我砸了太久了.如何防止用户在使用FormsAuthentication.SignOut注销后浏览网站的页面?我希望这样做:
FormsAuthentication.SignOut();
Session.Abandon();
FormsAuthentication.RedirectToLoginPage();
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.如果我直接输入URL,我仍然可以浏览到该页面.我有一段时间没有使用自己的安全性,所以我忘记了为什么这不起作用.
在我的网站中,当用户点击"注销"按钮时,Logout.aspx页面会加载代码Session.Clear().
在ASP.NET/C#中,这是否清除了所有cookie?或者是否需要添加任何其他代码才能删除我网站的所有Cookie?
这是场景:
我有一个登录页面,当用户签名时,它会被重定向到主页应用程序页面.然后用户使用浏览器后退按钮,现在他在登录页面上.他尝试再次登录,但现在抛出异常:
HttpAntiForgeryException(0x80004005):提供的防伪令牌适用于用户"",但当前用户是"userName".
我知道这与缓存有关.我使用自定义NoCache过滤器禁用了浏览器缓存以进行登录操作,该过滤器设置了所有必需的标头 - 无缓存,无存储,必须重新验证等.但是
我将尝试制作黑客并强制Safari移动刷新,但这不是我所期待的.
我想知道我是否可以:
更新1
为了澄清一下,我知道如何处理MVC中的错误.问题是这个处理错误根本解决了我的问题.错误处理的基本思想是重定向到自定义错误页面,并带有好消息.但我希望防止发生此错误,而不是以用户可见的方式处理它.通过句柄我的意思是捕获用户名替换或其他合适的操作然后继续登录.
更新2
我添加了下面的解决方案,这对我有用.
我的项目基于Visual Studio 2013的MVC 5项目模板(个人用户帐户选项).我一直依赖于我的用户的默认登录和注销方法.但我不确定我做了什么,在某些时候,用户不能再退出,但他们可以作为另一个用户登录.
这是帐户控制器的默认Logoff方法
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut();
return RedirectToAction("Index", "Home");
}
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
Run Code Online (Sandbox Code Playgroud)
这是显示用户用户名的默认_LoginPartial.cshtml视图.
@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
@Html.AntiForgeryToken()
<ul class="nav navbar-nav navbar-right">
<li>
@Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
</li>
<li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a> </li>
</ul>
}
}
else
{
<ul …Run Code Online (Sandbox Code Playgroud)