0

我很困惑如何实现这个功能。最初,当用户访问网站时,他们会看到登录页面。

[HttpGet]
public ActionResult SignIn()
{
  return View() ;
}

当用户输入详细信息时,它会调用:

[HttpPost]
public ActionResult Sign(SignInModel signInModel)
{
   if(service.ValidateUser(signInModel.userName,signInModel.passWord))
    {
        FormsAuthentication.SetAuthCookie(signInModel.userName, true);return           
        return RedirectToAction("Index", "Home");
    } 
}

但是,作为测试,我决定返回登录页面,因此localhost/Account/SignIn,但它不会将我重定向回主页..所以我尝试了一些来自 SO 的类似问题的建议答案:

[HttpGet]
public ActionResult SignIn()
{
  if(HttpContext.User.Identity.IsAuthenticated) 
  {
            return RedirectToAction("Index", "Home");
  }
  return View() ;

}

但我不明白它是如何工作的,所以我决定调试它。但事实证明它使用了错误的Identity.

为了解释,我使用默认的 MVC 模板来让我的项目正常工作,我在该模板上使用 James 登录。然而,在我自己的项目中,我使用 Peter 登录。

但是HttpContext.User.Identity在我自己的项目中是指默认网站的詹姆斯而不是彼得..所以那里显然有问题,但是什么?

TL;DR 我如何保留 StackOverflow 之类的信息?只有在会话到期或用户退出时,用户才能看到登录页面。

4

2 回答 2

1

如果我没有正确理解它,请纠正我。

  • 您在 localhost 上托管这两个网站。很可能是不同的端口号。
  • 您首先登录了虚拟网站(模板网站)。你得到了一个身份验证cookie。
  • 您没有退出虚拟网站。因此,您的身份验证 cookie 仍然有效。
  • 然后,您启动了实际的网站(您的项目)。当您请求登录页面时,您之前收到的 cookie 也会发送到服务器。发生这种情况的原因是 cookie 的范围仅限于域localhost和应用程序路径\。这两个网站都匹配。
  • 您将自己视为已登录和其他人。

你能做些什么来解决这个问题?

退出两个网站。不要登录虚拟网站。登录到实际网站。玩得开心。

更永久的修复?

要看。问题的发生是因为 cookie 的范围太松。如果需要在 上运行这两个网站localhost,那么您可以将 IDE 配置为在文件夹下启动它们。意思是虚拟网站在 启动,http://localhost:1234/dummy/实际在 启动http://localhost:4321/actual。对于普通 cookie,您将直接设置路径。对于 auth cookie,您可以使用该FormsAuthentication.GetAuthCookie方法。

来源:http : //telligent.com/support/telligent_evolution_platform/w/documentation/common-things-to-check-when-using-forms-authentication.aspx

HttpCookie cookie = FormsAuthentication.GetAuthCookie(username, true);
cookie.Path = "/dummy";
Response.Cookies.Add(cookie);

编辑:

似乎普遍的共识是不设定路径。https://stackoverflow.com/a/6940281/30007

Cookie 路径区分大小写,因此:

http://site/path
http://site/PATH

浏览器有 2 个不同的 cookie - 它们(IE、FX、Safari、Opera 或 Chrome)都不会将 /PATH 的 cookie 发送到 /path,反之亦然。

于 2012-11-24T16:03:44.253 回答
0

我认为您正在寻找的答案在那里:如何将 /Home 重定向到根目录?

编辑:

在这种情况下,试试这个:当你生成登录链接时,你可能想要传递returnUrl参数:

@Html.ActionLink("Log On", "LogOn", "Account", new { returnUrl = Request.Url }, null)

在您的具体情况下,您可以通过returnUrl成为主页。很抱歉造成混乱。

希望这可以帮助

于 2012-11-24T15:39:11.867 回答