我正在尝试在ASP.NET MVC中实现Logout Functionality。
我为我的项目使用Forms身份验证。
这是我的退出代码:
FormsAuthentication.SignOut();
Response.Cookies.Clear();
FormsAuthenticationTicket ticket =
new FormsAuthenticationTicket(
1,
FormsAuthentication.FormsCookieName,
DateTime.Today.AddYears(-1),
DateTime.Today.AddYears(-2),
true,
string.Empty);
Response.Cookies[FormsAuthentication.FormsCookieName].Value =
FormsAuthentication.Encrypt(ticket);
Response.Cookies[FormsAuthentication.FormsCookieName].Expires =
DateTime.Today.AddYears(-2);
return Redirect("LogOn");
此代码将用户重定向到登录屏幕。但是,如果我通过在地址栏中指定名称来调用操作方法(或从地址栏下拉列表中选择上一个链接),我仍然可以在不登录的情况下访问安全页面。
有人可以帮我解决问题吗?
答案 0 :(得分:6)
这很奇怪......我只打了一次电话:FormsAuthentication.SignOut();它有效...
public ActionResult Logout() {
FormsAuthentication.SignOut();
return Redirect("~/");
}
答案 1 :(得分:1)
要正确回答您的问题,我必须知道如何保护您的“安全”页面 我怀疑你在那里做错了什么。
对FormsAuthentication.SignOut()
的简单调用应该足够了,因为它会清除身份验证cookie,从而使其他方法调用使您在那里冗余。
使用ASP.NET MVC,您必须在操作方法上使用AuthorizeAttribute
来禁止未经身份验证的访问者使用它。 (含义:通过在Web.config
中指定位置标记,使用Web表单执行此操作的旧方法不再适用于MVC 。)
例如,这是我的ForumController
类的一个小代码段:
public class ForumController : Controller
{
...
[Authorize]
public ActionResult CreateReply(int topicId)
{
...
}
...
}
答案 2 :(得分:1)
以下问题与我的解决方案有效相关
答案 3 :(得分:0)
如果您在 web.config 文件中禁用[comment] 以下标记,以便轻松测试您的网络应用程序,则此方法有效。
public ActionResult SignOut()
{
FormsAuthentication.SignOut();
return RedirectToAction("Index", "Home");
}
的web.config
<authentication mode="Forms">
<forms name="Your Project Name" defaultUrl="/" loginUrl="/Users/Login" timeout="43200" />
</authentication>
<location path="Administrator">
<system.web>
<authorization>
<allow roles="Administrator" />
<deny users="*" />
</authorization>
</system.web>
</location>
<location path="UserPanel">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>