我们有一个用于注册的电子邮件确认页面,可以通过一次性使用链接点击以激活帐户。
网站的性质使我们可以允许此链接自动记录用户。正在审查此要求(根据我的要求!)。
以下情况有点令人困惑:
一切顺利,用户将自动登录,使用:
FormsAuth.SignIn(user.UserName,false);
从控制器返回视图
View使用包含 LogonUserControl.ascx 组件的部分视图的母版页。 在组件中,有以下代码(它直接来自asp.net mvc项目模板):
if (Request.IsAuthenticated) { /*foo*/ }
呈现页面时,尽管在控制器中签署了用户,但Request.IsAuthenticated
仍返回false。
我想知道为什么会这样。在调用FormsAuth.SignIn
方法时,是否已经写出主服务器,或者使用Request对象进行此检查是错误的,因为在收到请求时,它确实是未经过身份验证的?
编辑:默认的LogOn控制器似乎使用重定向而不是返回View。这当然会解决问题,但我感兴趣的是为什么上面的情况不起作用。
答案 0 :(得分:3)
它不起作用,因为在您的操作运行之前已经发生的请求未经过身份验证。请求经过身份验证,或者不是;它不能以未经过身份验证的方式启动生活,并在操作过程中进行身份验证。 Authenticated请求是使用有效身份验证票证提交的请求。由于登录请求不包含该请求,因此未经过身份验证且无法进行身份验证。
但是,当您重定向时,浏览器会发出一个新请求,当然,该请求会附带有效的身份验证票证,通常采用cookie的形式。
顺便说一句,在这种情况下,重定向是正确的做法。您的登录是POST,您应该使用Post / Redirect / Get模式。想象一下,登录页面将用户返回到站点主页。如果您返回视图而不是重定向到主页,那么当用户按F5刷新页面时,浏览器会警告他们他们即将重新提交他们的登录凭据,这不是您想要的。进行重定向会使浏览器对主页进行GET操作,因此如果用户按下F5,则不会收到警告。