13

在 ASP.NET MVC 中使用 DotNetOpenAuth 3 并实现 RememberMe 工具...

我发现即使我在 FormsAuthentication.RedirectFromLoginPage 和 FormsAuthentication.SetAuthCookie 中将 createPersistentCookie 设置为 true,一旦 ASP.NET 会话超时,用户也不会被记住。

如果我检查 cookie,我发现它被标记为持久性并且将来确实有到期日期,我假设是因为我将 web.config FORMS 超时设置为几年后。无论如何,如果用户关闭浏览器并重新打开它,它们会被正确记住——只要 ASP 会话没有超时。

Scott Hanselmann 的一篇较早的帖子让我想知道这是否是因为 FormsAuthentication 试图更新身份验证票证,并且可能是在一个不起作用的 OpenId 模型中,但我在 web.config 中设置了 FORMS SlidingExpiration="false" 无论如何我认为强制使用持久 cookie 会使这些东西变得无关紧要。

我还想知道为什么 DotNetOpenId MVC 示例不包含 RememberMe 复选框 - 也许它有些棘手?

另一方面,在 StackOverflow 上,我看到我在会话中被自动记住了。想知道他们是否使用 DotNetOpenId 以外的其他东西来进行 OpenId 身份验证。

还有其他人在 ASP.NET MVC 中使用 DotNetOpenId 成功完成了 RememberMe 吗?有什么技巧吗?

[更新]

感谢您的帮助,安德鲁。原来这与 DotNetOpenId 无关。

读完这篇文章后,我收集到我的托管服务提供商可能会定期回收应用程序池,这导致身份验证票证加密是使用新的机器密钥完成的。

根据前面的链接文章,我在 Web.Config 的 System.Web 下添加了以下内容,它解决了这个问题:

<machineKey
    validationKey="(generated a new key to place here)"     
    decryptionKey="(generated a new key to place here)"
    validation="SHA1"
    decryption="AES" />
4

2 回答 2

3

我仍然认为 cookie 名称应该匹配......但这里有别的东西。

听起来您是在说,只要您在 web.config 文件中的超时时间很大,那么一切正常。但是一旦你缩短它,你的持久 cookie 不会超过超时值。这个论坛主题帮助我回答了这个问题: http ://forums.asp.net/p/1010241/1347970.aspx#1347970

似乎 web.config 中的超时会影响所有 cookie。它说明身份验证票的持续时间。所有 auth cookie 都有这个“生存时间”超时,无论它们是否“持久”。所以持久性cookies和非持久性cookies的区别在于前者会在不同的浏览器会话中持续存在,而后者会在浏览器关闭时(提前)死掉。

那有意义吗?

于 2009-04-22T02:11:21.180 回答
2

您的 web.config 文件中的 cookie 名称与您的控制器对 FormsAuthentication.SetAuthCookie 的调用是否匹配?这可能是 DNOI 示例中的错误,但我怀疑如果您的 web.config 文件中有 cookie 名称(如 DNOI 示例那样),那么您可能必须将 cookie 名称设置为 SetAuthCookie 或 RedirectFromLoginPage 的第三个参数. 否则,forms auth 无法识别您设置为登录 cookie 的持久 cookie。

于 2009-04-22T02:02:07.770 回答