Asp.net Mvc FormsAuth与Site.Master中的LogonUserControl

时间:2009-09-08 19:44:11

标签: c# asp.net-mvc forms-authentication

我们有一个用于注册的电子邮件确认页面,可以通过一次性使用链接点击以激活帐户。

网站的性质使我们可以允许此链接自动记录用户。正在审查此要求(根据我的要求!)。

以下情况有点令人困惑:

  1. 用户点击其电子邮件中的确认链接
  2. 这落在确认控制器上。
  3. 一切顺利,用户将自动登录,使用:

    FormsAuth.SignIn(user.UserName,false);
    
  4. 从控制器返回视图

  5. View使用包含 LogonUserControl.ascx 组件的部分视图的母版页。 在组件中,有以下代码(它直接来自asp.net mvc项目模板):

    if (Request.IsAuthenticated) { /*foo*/ }
    

    呈现页面时,尽管在控制器中签署了用户,但Request.IsAuthenticated仍返回false。

    我想知道为什么会这样。在调用FormsAuth.SignIn方法时,是否已经写出主服务器,或者使用Request对象进行此检查是错误的,因为在收到请求时,它确实是未经过身份验证的?

    编辑:默认的LogOn控制器似乎使用重定向而不是返回View。这当然会解决问题,但我感兴趣的是为什么上面的情况不起作用。

1 个答案:

答案 0 :(得分:3)

它不起作用,因为在您的操作运行之前已经发生的请求未经过身份验证。请求经过身份验证,或者不是;它不能以未经过身份验证的方式启动生活,并在操作过程中进行身份验证。 Authenticated请求是使用有效身份验证票证提交的请求。由于登录请求不包含该请求,因此未经过身份验证且无法进行身份验证。

但是,当您重定向时,浏览器会发出一个新请求,当然,该请求会附带有效的身份验证票证,通常采用cookie的形式。

顺便说一句,在这种情况下,重定向是正确的做法。您的登录是POST,您应该使用Post / Redirect / Get模式。想象一下,登录页面将用户返回到站点主页。如果您返回视图而不是重定向到主页,那么当用户按F5刷新页面时,浏览器会警告他们他们即将重新提交他们的登录凭据,这不是您想要的。进行重定向会使浏览器对主页进行GET操作,因此如果用户按下F5,则不会收到警告。