Изменяется SessionId, вызывая эту ошибку «Ошибка проверки состояния. - PullRequest
0 голосов
/ 24 января 2019

Я создал сайт, который работает на двух серверах с балансировкой нагрузки (веб-ферма), через некоторое время мне пришлось сделать следующее:

на странице входа, когда пользователь вводит имя пользователяи, если пользователь действителен, я прекращаю сеанс и создаю новый следующим образом:

protected void btnLogin_Click(object sender, EventArgs e)
        {
            var Token = Guid.Empty;
            try
            {
                if (IsValidCaptcha())
                {
                    string email = txtEmail.Text.Trim();
                    string pw = txtPassword.Text.Trim();                      

                    AbandonSession();//Delete any existing sessions
                    var newSessionId = CreateSessionId(HttpContext.Current); //Create a new SessionId
                    SetSessionId(HttpContext.Current, newSessionId);

                    Token = SecureLogin.Login(email, pw, LangCode);

                }
                else
                {
                    lblMsg.Style.Add("display", "block");
                }
            }
            catch (Exception)
            {
                Token = Guid.Empty;
                lblMsg.Style.Add("display", "block");
            }

            if (Token != Guid.Empty)
            {
                Response.Redirect($"HiddenPage.aspx?token={Token.ToString()}", false);
            }
            else
            {
                lblMsg.Style.Add("display", "block");
            }

        }


protected void AbandonSession()
        {
            Session.Clear();
            Session.Abandon();
            Session.RemoveAll();
            if (Request.Cookies["ASP.NET_SessionId"] != null)
            {
                Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
                Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-20);
            }
            if (Request.Cookies["__AntiXsrfToken"] != null)
            {
                Response.Cookies["__AntiXsrfToken"].Value = string.Empty;
                Response.Cookies["__AntiXsrfToken"].Expires = DateTime.Now.AddMonths(-20);
            }
        }

        private string CreateSessionId(HttpContext httpContext)
        {
            var manager = new SessionIDManager();

            string newSessionId = manager.CreateSessionID(httpContext);

            return newSessionId;
        }

        public void SetSessionId(HttpContext httpContext, string newSessionId)
        {
            try
            {
                var manager = new SessionIDManager();

                manager.SaveSessionID(httpContext, newSessionId, out bool redirected, out bool cookieAdded);
            }
            catch(Exception ex)
            {
                SmtpMailer.SendMsg(ex.Message + ex.StackTrace + ex.InnerException, "", "");
            }

        }

Это одно из требований к сайту, и я вообще не могу его изменить(изменение сеанса после входа на сайт).

после применения этого подхода я начал получать эту ошибку почти на каждой странице сайта (время от времени).

Event code: 4009  
        Event message: Viewstate verification failed. 
        Reason: The viewstate supplied failed integrity check.  
        Event time: 1/22/2019 2:53:36 PM  
        Event time (UTC): 1/22/2019 7:53:36 PM  
        Event ID: 5ffacfa116224c9f8f516ead8a89cc55  
        Event sequence: 378  
        Event occurrence: 1  
        Event detail code: 50203    
        Application information: 
        Application domain: /LM/W3SVC/2/ROOT-1-131926597583461452 
        Trust level: Full 
        Application Virtual Path: / 
        Application Path: ........... 
        Machine name: ..............    Process information: 
        Process ID: 6624 
        Process name: w3wp.exe 
        Account name: IIS APPPOOL\..............    Request information: 
        Request URL: ............../qConsole/CampaignGroup-Launch.aspx
        Request path: /qConsole/CampaignGroup-Launch.aspx 
        User host address: .............. 
        User:  
        Is authenticated: False 
        Authentication Type:  
        Thread account name: IIS APPPOOL\..............

Я дважды проверил (а) ключ компьютера / ключ дешифрования одинаков на обоих серверах при балансировке нагрузки, и (б) что они не настроены на автоматическую генерацию

, а также я добавил этот код в Global.asax

protected void Session_Start(object sender, EventArgs e)
        {
            Session.Timeout = 60;
        }

и у меня есть этот набор в файле web.config

<sessionState timeout="25" />

У меня такое ощущение, что у меня возникла проблема, связанная с добавленной функцией (создание нового sessionIdпосле страницы входа в систему), любые идеи или мыслиочень признателен.

Обновление:

Я попробовал это, но это не помогло

Проверка состояния не удалась.Причина: предоставленное состояние просмотра не прошло проверку целостности.

Спасибо.

...