无法使用FormsAuthentication.SignOut()从ASP.NET MVC应用程序注销

时间:2010-10-08 09:42:49

标签: c# .net asp.net asp.net-mvc forms-authentication

我正在尝试在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");

此代码将用户重定向到登录屏幕。但是,如果我通过在地址栏中指定名称来调用操作方法(或从地址栏下拉列表中选择上一个链接),我仍然可以在不登录的情况下访问安全页面。

有人可以帮我解决问题吗?

4 个答案:

答案 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)

以下问题与我的解决方案有效相关

FormsAuthentication.SignOut() does not log the user out

答案 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>