2009-09-08 58 views
4

我们有一个用于注册的电子邮件确认页面,可以使用一次性链接来激活该帐户。在Site.Master中使用LogonUserControl的Asp.net Mvc FormsAuth

该网站的性质是这样的,我们可以让这个链接自动登录用户。这项要求正在审查中(应我的要求!)。

以下情况被证明是一个有点混乱:

  1. 用户按照他们的电子邮件
  2. 确认控制器上这土地上的确认链接。
  3. 所有的事情都是好的,该用户将自动登录,使用:

    FormsAuth.SignIn(user.UserName,false); 
    
  4. 从控制器

视图返回视图使用其中包含部分母版页视图是LogonUserControl.ascx组件。 内成分,有以下代码(说到直出asp.net的MVC项目模板):

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

当页面呈现,Request.IsAuthenticated是尽管在控制器签约用户返回false 。

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

编辑:它显示默认LogOn控制器使用重定向而不是返回视图。这当然会解决问题,但是我对上述场景为什么不起作用感兴趣。

回答

3

它不起作用,因为在您的操作运行之前已经发生的请求未通过身份验证。请求要么被认证,要么不是;它不能以未经认证的方式开始生活,并在行动中获得认证。已认证的请求是使用有效的认证凭证提交的。由于登录请求没有包含该信息,因此它未经过身份验证,无法进行身份验证。

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

顺便说一句,在这种情况下重定向是正确的。你的登录名是POST,你应该使用Post/Redirect/Get模式。试想一下,登录页面会将用户返回到网站主页。如果您返回视图而不是重定向到主页,那么当用户按F5刷新页面时,浏览器会警告他们他们将重新提交他们的登录凭据,这不是您想要的。做一次重定向会使浏览器为主页做一个GET,所以如果用户按F5,用户不会被警告。

+1

很好的解释,一段时间跑到这里,从来没有理解为什么,现在我做。 – mxmissile 2009-09-08 20:29:37