【问题标题】:Cookies not showing up in global.asaxCookie 未显示在 global.asax 中
【发布时间】:2018-04-27 17:23:59
【问题描述】:

我正在使用 cookie 传递用户信息以进行身份​​验证,如 this question 所示。一切正常,直到我们的团队升级了我们的计算机并且现在在 Windows 10 上。现在我的 cookie 在 global.asax.cs 的 Application_PostAuthenticateRequest 中找不到。

这是我尝试发送 cookie 的代码:

private void AddUserDataToCookies(User user)
    {
        var serializeModel = new WebUserSerializeModel
        {
            FirstName = user.Person.FirstName,
            MiddleName = user.Person.MiddleName,
            LastName = user.Person.LastName,
            CredentialNumber = user.CredentialNumber,
            Roles = user.Roles.Select(role => role.Name).ToList(),
            Permissions = user.Permissions.Select(perm => perm.PrimaryKey).ToList()
        };

        var userData = new JavaScriptSerializer().Serialize(serializeModel);
        var authTicket = new FormsAuthenticationTicket(1, user.CredentialNumber, DateTime.Now, DateTime.Now.AddMinutes(15), false, userData);
        var encryptedTicket = FormsAuthentication.Encrypt(authTicket);

        var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
        {
            Secure = true,
            HttpOnly = true
        };

        Response.Cookies.Add(cookie);

        var requestCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
    }

cookie 显示在请求 cookie 中。但是当我在我的 global.asax 中尝试时,它没有。我的全局 asax 代码如下。

protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
    {
        var cookie = Request.Cookies[FormsAuthentication.FormsCookieName];

        if (cookie != null)
        {
            try
            {
                var authTicket = FormsAuthentication.Decrypt(cookie.Value);

                if (authTicket != null)
                {
                    var serializer = new JavaScriptSerializer();
                    var serializeModel = serializer.Deserialize<WebUserSerializeModel>(authTicket.UserData);

                    var user = new WebUser(serializeModel.FirstName, serializeModel.LastName)
                    {
                        MiddleName = serializeModel.MiddleName,
                        CredentialNumber = serializeModel.CredentialNumber,
                        Roles = serializeModel.Roles,
                        Permissions = serializeModel.Permissions
                    };

                    HttpContext.Current.User = user;
                }
            }
            catch (CryptographicException ex)
            {
                Logger.Error("Error while decrypting cookie post authentication.", ex);
                FormsAuthentication.SignOut();
                HttpContext.Current.User = null;
            }
        }
    }

有没有人知道为什么更改为 Windows 10 可能会导致此问题?总的来说,我对 ASP.NET 和 Web 开发有点陌生。

编辑 - 通过在创建我的 cookie 时删除 Secure = true 我能够让它工作。在添加答案之前,我正在调查为什么会出现这种情况,我欢迎任何见解。

【问题讨论】:

    标签: c# asp.net-mvc authentication asp.net-mvc-5 windows-10


    【解决方案1】:

    正如我在编辑中提到的,问题是在创建我的 cookie 时将 Secure 设置为 true,但在本地运行时我没有启用 SSL,这与我猜想在我的旧工作站上不同。我的控制器中的代码目前如下所示:

    private void AddUserDataToCookies(User user)
        {
            var serializeModel = new WebUserSerializeModel
            {
                FirstName = user.FirstName,
                MiddleName = user.MiddleName,
                LastName = user.LastName,
                CredentialNumber = user.CredentialNumber,
                Roles = user.Roles,
                Permissions = user.Permissions
            };
    
            var userData = new JavaScriptSerializer().Serialize(serializeModel);
            var authTicket = new FormsAuthenticationTicket(1, user.CredentialNumber, DateTime.Now, DateTime.Now.AddMinutes(FormsAuthentication.Timeout.Minutes), false, userData, FormsAuthentication.FormsCookiePath);
            var encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    
            var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
            {
                HttpOnly = true,
                Secure = true
            };
    
            if (Request.IsLocal)
            {
                cookie.Secure = false;
            }
    
            Response.Cookies.Add(cookie);
        }
    

    离开 Request.IsLocal 有点难看,但现在已经足够了,直到我们决定是否要在本地为每个人实施 SSL。

    至少这很容易解决。

    【讨论】:

      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2015-05-24
      相关资源
      最近更新 更多