如何在使用 cookie 时将 Request.IsAuthenticated 设置为 true

本文关键字:IsAuthenticated Request 设置 true 时将 cookie | 更新日期: 2023-09-27 18:35:42

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

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

这是我使用的代码:

    // 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()方法被调用之前,IsAuthentication值被设置为false,在它被调用之后,它被设置为true。问题是,当我通过返回重定向到本地(returnUrl)重定向到主页时,该属性再次为假,我不知道该怎么做才能将其设置为true。

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

如何在使用 cookie 时将 Request.IsAuthenticated 设置为 true

通过将以下方法添加到 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);
            }
        }
    }

我想仍然不是最好的方法...

我建议你阅读 asp.net 过滤器,特别是关于 Controller.OnAuthorization。

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

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

我认为

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

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