C# Asp.net Mvc FormsAuth,在Site.Master中具有LogonUserControl
我们有一个注册的电子邮件确认页面,可以点击use once链接激活帐户 该网站的性质是,我们可以允许此链接自动登录用户。这项要求正在审查中(应我的要求!) 以下情况证明有点令人困惑: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组件。 组件中有以下代码(直接
FormsAuth.SignIn(user.UserName,false);
Request.IsAuthenticated
返回false,尽管用户已在控制器处登录
我想知道为什么会这样。在调用FormsAuth.SignIn
方法时,是否已经写出了master,或者使用Request对象进行此检查是错误的,因为在收到请求时,它确实未经过身份验证
编辑:默认登录控制器似乎使用重定向而不是返回视图。这当然可以解决问题,但是我对上面的场景不起作用的原因很感兴趣。它不起作用,因为在您的操作运行之前已经发生的请求没有经过身份验证。请求要么经过身份验证,要么未经身份验证;它不能作为一个未经认证的生命而开始,并在一个行动中被验证。经过身份验证的请求是使用有效身份验证票证提交的请求。由于登录请求不包含该内容,因此未对其进行身份验证,无法进行身份验证 但是,当您重定向时,浏览器会发出一个新的请求,当然,该请求会附带一个有效的身份验证票证,通常以cookie的形式出现
顺便说一句,在这种情况下,重定向是正确的做法。您的登录是一个POST,您应该使用POST/Redirect/Get模式。假设登录页面将用户返回到站点主页。如果返回视图而不是重定向到主页,则当用户按F5刷新页面时,浏览器会警告他们即将重新提交登录凭据,而这不是您想要的。执行重定向会使浏览器获取主页,因此,如果用户按F5键,将不会收到警告。很好的解释,前一段时间遇到过这种情况,从未理解为什么,现在我知道了。
if (Request.IsAuthenticated) { /*foo*/ }