Я создал сайт, который работает на двух серверах с балансировкой нагрузки (веб-ферма), через некоторое время мне пришлось сделать следующее:
на странице входа, когда пользователь вводит имя пользователяи, если пользователь действителен, я прекращаю сеанс и создаю новый следующим образом:
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после страницы входа в систему), любые идеи или мыслиочень признателен.
Обновление:
Я попробовал это, но это не помогло
Спасибо.