9

在检查用户的凭据并确认它们是好的之后,我正在使用FormsAuthentication.SetAuthCookie("Username", false);对用户进行身份验证。

然后,在母版页中,我Page.User.Identity.IsAuthenticated用来确保我们处理的是登录用户而不是访客。

问题在于首先设置 auth cookie。当我设置 auth cookie 后,我立即运行一个方法,该方法用于Page.User.Identity.IsAuthenticated将欢迎消息从通用的“欢迎,客人!”中更改。向更个人化的消息“欢迎,用户名!” 信息。这在我转到另一个页面之前不起作用,所以我知道登录过程已经成功,但似乎在刷新或重定向发生之前我无法访问我需要的信息。

设置 auth cookie 后是否需要重定向用户Page.User.Identity.IsAuthenticated才能更改消息?

4

2 回答 2

6

我想指出实际上有一种方法可以解决这个问题(因为我从来没有在任何其他类似的问题中看到过这样的说法)。您无需重定向即可检索 User.Identity 信息的来源 cookie 及其数据。问题是,cookie 还没有发送到浏览器。

它只是从 Response.Cookies 对象中获取 FormsAuthentication 生成的 cookie:

HttpCookie EncryptedCookie = Response.Cookies.Get(FormsAuthentication.FormsCookieName);
FormsAuthenticationTicket DecryptedCookie;
try {
    DecryptedCookie = FormsAuthentication.Decrypt(EncryptedCookie.Value);
} catch (ArgumentException) {
    // Not a valid cookie
    return false;
}
// DecryptedCookie.Name: The Username
// DecryptedCookie.UserData: Any additional data, as a string. This isn't normally used
return !DecryptedCookie.Expired;
于 2013-06-06T18:55:42.800 回答
6

我以前见过这个,所以我知道答案是肯定的。(如,是的,您确实需要重定向用户才能正确使用Page.User.Identity.IsAuthenticated

我想象的原因是因为IsAuthenticated评估当前请求,当当前请求第一次进来时,它被记录为未经过身份验证。

您需要做的是在不检查的情况下应用您在所述方法中拥有的任何逻辑IsAuthenicated(使其假设为真)。

现在我不知道您的方法的详细信息,以建议如何对其进行重构以应对此问题,但是您可以将“Do Stuff”部分拆分为一个单独的函数,然后您可以直接从您的登录函数中调用该函数绕过身份验证检查。


编辑:要支持我的假设,您可以阅读此页面

有趣的部分:

forms-authentication ticket 为浏览器发出的下一个请求提供表单认证信息。

于 2012-04-17T11:51:52.267 回答