在检查用户的凭据并确认它们是好的之后,我正在使用FormsAuthentication.SetAuthCookie("Username", false);
来验证用户身份。
在母版页中,我使用Page.User.Identity.IsAuthenticated
确保我们正在处理已登录的用户,而不是来宾。
问题在于首先设置auth cookie。当我设置auth cookie时,我立即运行一个方法,使用Page.User.Identity.IsAuthenticated
来更改来自通用“欢迎,来宾!”的欢迎消息。消息更个性化“欢迎,用户名!”信息。在我转到另一个页面之前这不起作用,所以我知道登录过程有效,但在刷新或重定向发生之前,我似乎无法访问所需的信息。
我是否需要在设置身份验证Cookie后重定向用户,以便使用Page.User.Identity.IsAuthenticated
更改消息?
答案 0 :(得分:6)
我之前见过这个,所以我知道答案是肯定的。 (如同,是的,您需要将用户重定向到正确使用Page.User.Identity.IsAuthenticated
)
我想象的原因是因为IsAuthenticated
评估当前请求,并且当前请求首次出现时,它被记录为未经过身份验证。
您需要做的是应用所述方法中的任何逻辑,而不检查IsAuthenicated
(假设为真)。
现在我不知道你的方法的细节,建议如何重新考虑它以应对这个问题,但是你可以将" Do Stuff"部分进入一个单独的函数,然后您可以直接从您的登录函数调用以绕过身份验证检查。
编辑:要备份我的假设,您可以read this page。
有趣的部分:
表单身份验证票证提供表单身份验证 信息到浏览器发出的下一个请求。
答案 1 :(得分:5)
我想指出实际上有一种解决方法(因为我从来没有在任何其他类似的问题中看到过这种说法)。您可以在没有重定向的情况下检索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;