【问题标题】:ASP.NET Forms Authentication CookieASP.NET 表单身份验证 Cookie
【发布时间】:2014-04-01 17:47:08
【问题描述】:

我们尝试实现 ASP.Net 表单身份验证。

在我们的开发环境/服务器中一切正常。但是当我们发布到生产环境时,我们注意到 cookie 在 FireFox 和 Chrome 中无法正常工作。 IE11 和 Safari (Mac OSX) 可以工作。

当我查看“此页面设置的 Cookie”(Chrome)时,我可以看到 cookie(在开发环境和生产环境中)

但是当我检查开发工具(Chrome)时,我在 Production 上测试时没有 Cookie,但在 Development 上测试时却有 Cookie。

当我请求检查“Context.User.Identity.IsAuthenticated”时,生产环境返回 false,而开发环境返回 true。

两台服务器上的代码相同:

protected void Page_Load(object sender, EventArgs e)
    {
        this.StatusLabel.Text = "Authorized : " + Context.User.Identity.IsAuthenticated.ToString();
    }

    protected void SetCookieButton_Click(object sender, EventArgs e)
    {
        FormsAuthentication.SetAuthCookie("TESTER", true);
    }

    protected void DeleteCookieButton_Click(object sender, EventArgs e)
    {
        FormsAuthentication.SignOut();
    }

    protected void AuthorizedRequiredButton_Click(object sender, EventArgs e)
    {
        if (Context.User.Identity.IsAuthenticated)
            this.StatusLabel.Text = "SUCCESS!!" + User.Identity.Name;
        else
            this.StatusLabel.Text = "NOT AUTHORIZED!";
    }

    protected void AuthorizedNotRequiredButton_Click(object sender, EventArgs e)
    {
        this.StatusLabel.Text = "SUCCESS!!";
    }

Web.config 也是如此

<authentication mode="Forms">
      <forms name="TestingSession" cookieless="UseCookies" protection="All" timeout="30" ></forms>
    </authentication>

为什么它不能在我的生产环境中的 Chrome 和 FireFox 中运行,而它在 IE11 和 Safari(在 Mac OSX 上)中运行。

为什么它可以在我在开发环境中测试的所有浏览器中工作?它是IIS设置吗?服务器问题?还是我错过了其他东西。

希望有人能帮帮我。

编辑:2014 年 3 月 3 日

经过更多测试后,我注意到响应标头日期错误。

总是:格林威治标准时间 2014 年 10 月 21 日星期二 18:04:35

再次调用页面或在其他浏览器中调用时,日期不会更改。

这表示Cookie返回浏览器时已经过期了?

我已经检查了 IIS7 的自定义标头,但没有找到。

我们还重置了服务器上的 Http 服务,但仍然没有成功。

【问题讨论】:

  • 您能否确保 DevPro 都具有相同的 web.config 设置 (连接字符串除外) 和相同的 .Net Framework ?
  • Web.config 和 .Net Framework 是一样的。两台服务器上的几乎所有内容都相同,除了数据库内容。我开始认为它必须是某个地方的设置。
  • “这意味着 Cookie 在返回到浏览器时已经过期” - 你所拥有的日期是 提前 时间的,为什么这会使 cookie 过期吗?
  • @James 我自己也不确定。我将 Web.config 中的超时更改为较高的值(3000000)。这行得通。 cookie 和 ASP.NET 表单身份验证按预期工作。但我显然不希望超时时间这么长。
  • 您使用的是哪个版本的 ASP.NET? 30 应该绰绰有余,也就是 30 分钟。

标签: asp.net google-chrome cookies


【解决方案1】:

对于登陆此页面的任何人:

@Mithrodin 的回答确实解决了这个问题,但如果应用程序服务器上的 DateTime 发生变化,这个问题将来可能会发生。这可能是故意的,也可能是因为夏令时效应。

当使用以下方法设置永久cookie时,此问题是特定的:

FormsAuthentication.SetAuthCookie("TESTER", true);

以后避免此问题的解决方案是在上述方法中将 false 作为第二个参数传递。由于 cookie 不是永久的,请在 web.config 的 FormsAuthentication 标签中设置适当的超时时间以使其正常工作。

【讨论】:

    【解决方案2】:

    我们通过重启服务器解决了这个问题。

    经过进一步研究,我们发现响应标头日期与上一期的日期相同。

    几个月前,我们向服务器添加了更多 RAM。之后,服务器日期设置在未来(2014 年 10 月 21 日)。我们很快就注意到了这个问题,并将日期设置回实际日期。

    那时我们从未重新启动服务器。似乎响应标头中返回的日期确实需要重新启动。

    我们为解决此问题而采取的步骤。

    • 确保服务器日期是实际日期。
    • 重置服务器上的 HTTP 服务。
    • 重启服务器。

    我希望这可以帮助其他有同样问题的人。

    【讨论】:

    • 您能找出根本原因吗?这肯定可以解决问题。
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2017-10-26
    • 2011-08-19
    • 2011-01-10
    • 1970-01-01
    • 2017-03-30
    相关资源
    最近更新 更多