2015-09-28 40 views
0

首先,我是一个ASP.NET新手,所以很抱歉,如果这个问题是愚蠢的!ASP.NET MVC4 LogOff不工作

如果用户名/密码与数据库数据匹配,我已经创建了一个使用会话变量的登录系统! 的问题是,虽然即时通讯能够登录我不能退出

// 
    // POST: /Account/LogOff 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     Session.RemoveAll(); 
     return RedirectToAction("Index", "Home"); 
    } 

上面的代码是从所述的AccountController

@if (Session["LoggedUser"]!=null) { 
<text> 
    Hello, @Html.ActionLink(Session["Username"].ToString(), "Manage", "Account", routeValues: null, htmlAttributes: new { @class = "username", title = "Manage" })! 
    @using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" })) { 
     @Html.AntiForgeryToken() 
     <a href="javascript:document.getElementById('logoutForm').submit()">LogOff</a> 
    } 
</text>} else { 
<ul> 
    <li>@Html.ActionLink("Register", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li> 
    <li>@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li> 
</ul>} 

和上述距离_partialLogin

我的问题是,当我按logOff该站点只是跳过控制器的LogOff部分,并且会话未清除,这意味着即时消息仍然以用户身份登录 感谢您的帮助

编辑: 这里是登录页面的情况下,控制器是需要:

// 
    // GET: /Account/Login 

    [AllowAnonymous] 
    public ActionResult Login(string returnUrl) 
    { 
     ViewBag.ReturnUrl = returnUrl; 
     return View(); 
    } 

    // 
    // POST: /Account/Login 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(LoginModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      DefaultConnection dc = new DefaultConnection(); 
      var Users = (from c in dc.NonActivated_Users select c).ToList<NonActivated_Users>(); 
      foreach (NonActivated_Users nua in Users){ 
       if (nua.Password_Hash == Hasher.HashString(model.Password) && nua.Username==model.UserName){ 
        Session["LoggedUser"] = nua; 
        Session["Rights"] = 4; //non activated user 
        Session["Username"] = 0; 
        nua.LastActive = DateTime.Now; 
        dc.SaveChanges(); 
        return RedirectToLocal(returnUrl); 
       } 
      } 
      var Users1 = (from c in dc.User select c).ToList<User>(); 
      foreach (User au in Users1) 
      { 
       if (au.Password_Hash == Hasher.HashString(model.Password) && au.Username == model.UserName) 
       { 
        Session["LoggedUser"] = au; 
        if (au.Membership == false) { 
         Session["Rights"] = 3; //activated user non premium 
        } 
        else 
        { 
         Session["Rights"] = 2; //activated user premium 
        } 
        au.Last_Active = DateTime.Now; 
        dc.SaveChanges(); 
        return RedirectToLocal(returnUrl); 
       } 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     ModelState.AddModelError("", "The user name or password provided is incorrect."); 
     return View(model); 
    } 

回答

1

您没有设置FormsAuthentication饼干,出于这个原因,你不能达到你的注销等动作。

您将需要[AllowAnonymous]属性,或在成功登录设置身份验证cookie来装饰你的注销等动作

FormsAuthentication.SetAuthCookie(user.Username, false); 

编辑:

我建议你检查用户身份验证User.Identity.IsAuthenticated,而不是检查是否存在会话。 除此之外,您可以将会话变量存储到单个自定义对象,然后将该对象存储到单个会话中。在项目的后期阶段跟踪你的会话会更容易:)

+0

你真了不起!谢谢:) –

+0

欢迎:) – Robert