部分视图中的登录无效

时间:2016-12-01 10:28:53

标签: c# asp.net-mvc asp.net-mvc-4

我正在尝试在部分视图上创建登录,而无需在有人登录时刷新整个浏览器。

登录控制器工作正常,并且选择确定以后必须显示的部分视图。问题是此部分View未检测到用户已记录。

如果我刷新网页(F5),我可以看到用户就像我说的那样,记录良好。

的Controler:

[AllowAnonymous]
public ActionResult Login() {
    return PartialView("_Login");
}

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl) {
    if(ModelState.IsValid) {               
        if(WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe.Value)) {
            return PartialView("LogOnPartialView", "Shared");                    
        }
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
    }
    return View(model);
}

部分视图_login

@using (Ajax.BeginForm("Login", "Account", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "loginControl" }))
{
    @Html.AntiForgeryToken()

    <div class="form-field">
        @Html.EditorFor(m => m.UserName)
        @Html.ValidationMessageFor(m => m.UserName)
    </div>

    <div class="form-field">
        @Html.EditorFor(m => m.Password)
        @Html.ValidationMessageFor(m => m.Password)
    </div>

      <input type="submit" value="Login" />
}

部分查看LogOnPartialView

@if (HttpContext.Current.User.Identity.IsAuthenticated)
{
  <div>user is logged</div>
}
else
{
    <div>user is NOT logged</div>
}

@if(!Request.IsAuthenticated) 
{
    @Html.ActionLink("Registro", "Register", "Account") 
    @: | 
    @Ajax.ActionLink("Login", "Login", "Account", new AjaxOptions { UpdateTargetId = "Login" })
}
else 
{
    @: Welcome <b>@User.Identity.Name</b>!

    @: |
    @Html.ActionLink("Logout", "LogOff", "Account")
}

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

我怀疑你是否会以目前的形式开展工作。如果您阅读the docs,则说明

  

当用户登录时,ASP.NET会在cookie中设置一个身份验证令牌,让ASP.NET知道用户已登录的后续请求

请注意使用“后续请求”一词。 在同一请求中使用它的问题是传入请求发送了auth cookie,因此IsAuthenticated为false。 即。

  1. 浏览器提交Login
  2. 服务器以Set-Cookie
  3. 回复
  4. 浏览器在下一个请求
  5. 上发送此cookie(auth cookie)

    这就是你点击F5时它起作用的原因

    解决此问题的方法是调用WebSecurity.Login调用结果,指示用户是否已成功登录并传递给LogOnPartialView