FormsAuthentication.SetAuthCookie()是否需要重定向?

Sgt*_*rdy 9 c# asp.net forms-authentication

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

然后在主页中我Page.User.Identity.IsAuthenticated确保我们正在处理登录用户而不是访客.

问题在于首先设置auth cookie.当我设置auth cookie时,我立即运行一个方法,用于Page.User.Identity.IsAuthenticated更改来自通用"欢迎,来宾!"的欢迎消息.消息更个性化"欢迎,用户名!" 信息.在我转到另一个页面之前这不起作用,所以我知道登录过程有效,但似乎我无法访问我需要的信息,直到刷新或重定向发生.

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

mus*_*fan 6

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

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

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

现在我不知道你的方法的细节,建议如何重新考虑它以应对这个,但你可以将"Do Stuff"部分拆分成一个单独的函数,然后你可以直接从你的登录函数调用绕过身份验证检查.


编辑:要备份我的假设,您可以阅读此页面.

有趣的部分:

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


Plu*_*uto 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;
Run Code Online (Sandbox Code Playgroud)