当我使用cookie时,如何将Request.IsAuthenticated设置为true

时间:2014-12-30 10:27:57

标签: c# asp.net asp.net-mvc cookies forms-authentication

我认为我所描述的问题很常见,但我找不到任何可以帮助我的解决方案。我创建了一个ASP.NET MVC项目但是我不想创建自己的内置身份验证系统,因为我已经有一个包含用户信息的数据库(用户名,电子邮件地址,密码等)

我想使用FormsAuthentication并将其连接到我自己的数据库,我假设我已经完成了,但每次我向应用程序发送新请求时,Request.IsAuthenticated属性始终设置为false。 / p>

这是我正在使用的代码:

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

    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        using (var db = new dbEntities())
        {
            var result = db.Person.Any(x => x.Email == model.Email && x.Password == model.Password);
            switch (result)
            {
                case true:
                    FormsAuthentication.SetAuthCookie(model.Email, true);
                    resetRequest();
                    return RedirectToLocal(returnUrl);
                default:
                    ModelState.AddModelError("", "Invalid login attempt.");
                    return View(model);
            }
        }
    }

    private void resetRequest()
    {
        var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (authTicket != null && !authTicket.Expired)
            {
                var roles = authTicket.UserData.Split(',');
                System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles);
            }
        }
    }

并且它运行良好,在调用resetRequest()方法之前,IsAuthenticated值设置为false,在调用它之后设置为true。问题是,当我通过返回RedirectToLocal(returnUrl)重定向到主页面时,该属性再次为false,我不知道如何将其设置为true。

我是否必须在控制器中的每个方法的开头调用resetRequest()等方法?我不认为这是一个优雅的解决方案。谁能帮帮我呢?

4 个答案:

答案 0 :(得分:3)

通过向Global.asax添加以下方法解决:

    protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
    {
        var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (authTicket != null && !authTicket.Expired)
            {
                var roles = authTicket.UserData.Split(',');
                System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles);
            }
        }
    }

我认为仍然不是最好的方法......

答案 1 :(得分:0)

我建议你阅读asp.net filters, 尤其是关于Controller.OnAuthorization

这是您在asp.net mvc中处理授权操作的标准方法。

答案 2 :(得分:0)

设置auth cookie应该足够了,您是否已将身份验证模式设置为web.config中的表单?

答案 3 :(得分:0)

我认为,你应该在web.conf中添加一些配置

<system.web>
     ............
     ......
     <authentication mode="Forms">
         <forms loginUrl="~/Login/UserLogin" timeout="2880" />
     </authentication>
</system.web>