表单身份验证 Cookie 未设置用户数据值

本文关键字:用户数 数据 用户 设置 身份验证 Cookie 表单 | 更新日期: 2023-09-27 18:37:11

我不小心跳进了饼干的世界,并试图了解发生了什么。 我有一个使用 FormsAuthentication 在 Visual Studio 20120/C# 中开发的 Web 应用程序。 当我第一次开发应用程序时,我创建了几个字段来存储在身份验证 cookie 中:personID、firstName 和 admin,字符串如下所示:777|吉米|1. 从那以后,一切都很顺利。 现在,我在模糊的末尾添加了第四个字段,称为"secBlur"。当我这样做并尝试检索 secBlur 的值时,它告诉我数组范围超出范围,因为早期版本的 cookie 不包含此字段......意义。 在过去的几天里,我一直在尝试重写我的cookie的有效性检查,我认为我已经弄清楚了一切。 但是,当我去将新的用户数据字符串写入cookie时,它似乎没有这样做。 我的代码在下面,我将尝试完成我正在做的事情......

在我的母版页的page_load中,我要做的第一件事是调用我创建的 cookie 类,以检查 cookie 是否正确版本:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.IsAuthenticated) 
        {
            authCookie ac = new authCookie();
            ac.validate();
            LoginName ct = (LoginName)loginStatus.FindControl("HeadLoginName");
            if (ct != null)
            {
                formValues fv = new formValues();
                ct.FormatString = fv.firstName;
            }
        }
    }

我的整个饼干课都在下面。 在验证方法中,我检查cookie是否存在,然后检查它是否正确版本以及用户数据是否存在。 如果版本不正确或用户数据不存在,我调用getUserData方法来检索今年的最新信息,创建一个新票证,将票证存储到cookie中,然后保存cookie。 我认为保存饼干的行是问题所在,但我不确定。

using System;
using System.Data.SqlClient;
using System.Runtime.Remoting.Contexts;
using System.Web;
using System.Web.Security;
using System.Web.UI.WebControls;
namespace DMC.Classes
{
    public class authCookie
    {
        public void cookiePrep(Login LoginUser)
        {
            string userData = "unknown|unknown";
            // Concat the values into a single string to pass into the cookie
            userData = getUserData(LoginUser.UserName);
            // Create the cookie that contains the forms authentication ticket
            HttpCookie authCookie = FormsAuthentication.GetAuthCookie(LoginUser.UserName, LoginUser.RememberMeSet);
            // Get the FormsAuthenticationTicket out of the encrypted cookie
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
            FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(3,
                                                                                ticket.Name,
                                                                                ticket.IssueDate,
                                                                                ticket.Expiration,
                                                                                LoginUser.RememberMeSet,
                                                                                userData,
                                                                                ticket.CookiePath);
            // Manually add the authCookie to the Cookies collection
            authCookie.Value = FormsAuthentication.Encrypt(newTicket);
            HttpContext.Current.Response.Cookies.Add(authCookie);
            string redirUrl = FormsAuthentication.GetRedirectUrl(LoginUser.UserName, LoginUser.RememberMeSet);
            if (redirUrl == null)
                redirUrl = "../default.aspx";
            HttpContext.Current.Response.Redirect(redirUrl);
        }
        public string getUserData(string userID)
        {
            string userData = "";
            // Grab this user's firstname, personID, and Admin status
            string mySQL = "exec get_adBasicInfo @userName";
            string cf = System.Configuration.ConfigurationManager.ConnectionStrings["DistrictAssessmentDWConnectionString"].ConnectionString;
            SqlConnection connection = new SqlConnection(cf);
            SqlCommand command = new SqlCommand(mySQL, connection);
            command.Parameters.AddWithValue("@userName", userID);
            connection.Open();
            SqlDataReader dr = command.ExecuteReader();
            if (dr.HasRows)
            {
                while (dr.Read())
                    userData = string.Concat(dr["personID"], "|", dr["firstName"], "|", dr["secBlur"]);
            }
            dr.Close();
            return userData;
        }
        public void validate()
        {
            HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
                /**********************************************************************************************************************
                 * Version 3: Added the secBlur field onto the userData string to see if logged in user needs to have sensitive       *
                 *              data blurred out (0: Normal; 1: Blur Sensitive Data                                                   *
                 **********************************************************************************************************************/
                if ((ticket.Version != 3) || (ticket.UserData == ""))
                {
                    string userData = getUserData(ticket.Name);
                    FormsAuthenticationTicket newAuthTicket = new FormsAuthenticationTicket(3,
                                                                                            ticket.Name,
                                                                                            ticket.IssueDate,
                                                                                            ticket.Expiration,
                                                                                            ticket.IsPersistent,
                                                                                            userData,
                                                                                            ticket.CookiePath);
                    authCookie.Value = FormsAuthentication.Encrypt(newAuthTicket);
                    HttpContext.Current.Response.SetCookie(authCookie);
                }
            }
        }
    }
}

此时,控件将传递回母版页的 load_page 函数,并尝试通过调用我的 formValues 类从 cookie 中检索用户的名字,如下所示:

using DMC.Classes;
using System.Web;
using System.Web.Security;
namespace DMC.Classes
{
    public class formValues : System.Web.Services.WebService
    {
        public string firstName = getFirstName();
        public string personID = getPersonID();
        public string secBlur = getSecBlur();
        private static string getUserDataString(int ix)
        {
            string retValue = "";
            if (HttpContext.Current.Request.IsAuthenticated)
            {
                HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
                if (authCookie != null)
                {
                    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
                    if (ticket != null)
                    {
                        string[] userData = { "" };
                        char[] delimiterChar = { '|' };
                        userData = ticket.UserData.Split(delimiterChar);
                        retValue = userData[ix];
                    }
                }
            }
            return retValue;
        }
        private static string getFirstName()
        {
            string firstName = getUserDataString(1);
            return firstName;
        }
        private static string getPersonID()
        {
            string personID = getUserDataString(0);
            return personID;
        }
        private static string getSecBlur()
        {
            string secBlur = getUserDataString(2);
            return secBlur;
        }
    }
}

在尝试获取FirstName时,我在尝试设置retValue时在getUserDataString方法中出现错误,因为userData数组为空。 那么有人可以告诉我哪里出错了吗?

表单身份验证 Cookie 未设置用户数据值

在我的authCookie类中,我从:

HttpContext.Current.Response.SetCookie(authCookie);

HttpContext.Current.Response.Add(authCookie);

不过我不喜欢这个,因为从我读到的内容来看,如果 cookie 已经存在,这不会覆盖 cookie,它只会创建一个副本。但我一直在玩,这是似乎唯一有效的东西。 如果有人有更好的解决方案,请分享!!