Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.net Mvc FormsAuth,在Site.Master中具有LogonUserControl_C#_Asp.net Mvc_Forms Authentication - Fatal编程技术网

C# Asp.net Mvc FormsAuth,在Site.Master中具有LogonUserControl

C# Asp.net Mvc FormsAuth,在Site.Master中具有LogonUserControl,c#,asp.net-mvc,forms-authentication,C#,Asp.net Mvc,Forms Authentication,我们有一个注册的电子邮件确认页面,可以点击use once链接激活帐户 该网站的性质是,我们可以允许此链接自动登录用户。这项要求正在审查中(应我的要求!) 以下情况证明有点令人困惑: 用户在其电子邮件中遵循确认链接 这将降落在确认控制器上 如果一切正常,用户将自动登录,使用: FormsAuth.SignIn(user.UserName,false); 视图从控制器返回 视图使用母版页,该母版页包含一个局部视图,该视图是LogonUserControl.ascx组件。 组件中有以下代码(直接

我们有一个注册的电子邮件确认页面,可以点击use once链接激活帐户

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

以下情况证明有点令人困惑:

  • 用户在其电子邮件中遵循确认链接
  • 这将降落在确认控制器上
  • 如果一切正常,用户将自动登录,使用:

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

  • 视图使用母版页,该母版页包含一个局部视图,该视图是LogonUserControl.ascx组件。 组件中有以下代码(直接来自asp.net mvc项目模板):

    呈现页面时,
    Request.IsAuthenticated
    返回false,尽管用户已在控制器处登录

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


    编辑:默认登录控制器似乎使用重定向而不是返回视图。这当然可以解决问题,但是我对上面的场景不起作用的原因很感兴趣。

    它不起作用,因为在您的操作运行之前已经发生的请求没有经过身份验证。请求要么经过身份验证,要么未经身份验证;它不能作为一个未经认证的生命而开始,并在一个行动中被验证。经过身份验证的请求是使用有效身份验证票证提交的请求。由于登录请求不包含该内容,因此未对其进行身份验证,无法进行身份验证

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


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

    很好的解释,前一段时间遇到过这种情况,从未理解为什么,现在我知道了。
    if (Request.IsAuthenticated) { /*foo*/ }