FormsAuthentication.SetAuthCookie()需要重定向吗?

9

在检查用户凭据并确认它们有效后,我使用FormsAuthentication.SetAuthCookie("用户名", false);进行用户身份验证。

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

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

我需要在设置了auth cookie后重定向用户才能使用Page.User.Identity.IsAuthenticated更改消息吗?

2个回答

6
我之前见过这个问题,所以我知道答案是肯定的(即,是的,你需要重定向用户以正确使用Page.User.Identity.IsAuthenticated)。
我想造成这种情况的原因是因为IsAuthenticated评估了当前请求,当当前请求首次进入时,它被记录为未经身份验证。
您需要做的是应用您在该方法中具有的任何逻辑,而不检查IsAuthenicated(使它假定为真)。
现在,我不知道您的方法的详细信息,因此无法建议如何重新设计它以应对此问题,但您可以将“执行操作”部分拆分为单独的函数,然后直接从登录函数调用它以绕过身份验证检查。

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

有趣的部分:

表单验证票证提供表单验证信息给浏览器发出的下一个请求。


啊,看来确实是这样的,谢谢你的回答!我想我可以在用户认证后直接重定向,这样我就不必费心编写一个解决方案来填充欢迎消息了。 - Sgt Beardy
@SgtBeardy:是的,重定向听起来对我来说是足够好的解决方案。 - musefan

6
我想指出实际上有一种方法可以解决这个问题(因为我从来没有在其他类似的问题中看到过这种说法)。您可以在不进行重定向的情况下检索Cookie及其数据,其中包含User.Identity信息。问题在于,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;

1
谢谢@Pluto,你救了我们的一天!!!正是你的评论“cookie还没有发送到浏览器”提供了突破口。 - Eric Nelson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接