Сессии перепутались на сайте asp.net - PullRequest
9 голосов
/ 01 июня 2011

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

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

Теперь я прошел его код для аутентификации, и он выглядит так:

  1. Пользователь вводит имя пользователя / пароль на общедоступной странице и нажимает отправить
  2. На Page_Load на главной странице код проверяет в базе данных mySql, что имя пользователя / пароль действительны, не истек и т. Д., И возвращает уникальный идентификатор пользователя, если все в порядке
  3. Затем страница сохраняет страницу входа в сеанс, как показано ниже (используется для последующего выхода из системы): HttpContext.Current.Session(Consts.CCookieName_LoginUrl) = Request.RawUrl
  4. Затем идентификатор пользователя сохраняется следующим образом: FormsAuthentication.SetAuthCookie(userid, False)
  5. Затем выполняется перенаправление в безопасную зону: Context.Response.Redirect(secureurl, False)
  6. В Page_Init главной страницы защищенной области идентификатор пользователя читается: userid = Context.User.Identity.Name
  7. пользовательские данные загружаются в соответствии с идентификатором пользователя
  8. Пользователь перемещается по защищенной области, т.е. шаг 6 - 7 повторяется
  9. Пользователь неожиданно видит данные других пользователей

У меня есть некоторые идеи о том, что идет не так, но я хотел бы получить некоторую информацию до изменения кода, так что, пожалуйста, кто-нибудь?

Ответы [ 2 ]

6 голосов
/ 01 июня 2011

Сложно сказать здесь. Вы настроили Аутентификацию формы?

Это процесс, который вы должны выполнить для проверки подлинности формы: В вашем web.config вы устанавливаете систему аутентификации:

<authentication mode="Forms">
    <forms loginUrl="Login.aspx" defaultUrl="Home.aspx" timeout="30" slidingExpiration="true" />
</authentication>

<authorization>
  <deny users="?"/>
</authorization>

Ваша страница входа в систему (post-back) проверяет учетные данные (не вашу главную страницу). Если пользователь действителен, тогда вы устанавливаете cookie:

FormsAuthentication.SetAuthCookie (идентификатор пользователя, False)

и перенаправить на другую страницу. Теперь вы должны установить ваше основное чтение куки здесь:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
    if (HttpContext.Current.User != null) {
        if (Request.IsAuthenticated == true) {    
            // Debug#1            
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
            // In this case, ticket.UserData = "Admin"                
            string[] roles = new string[1] { ticket.UserData }; 
            FormsIdentity id = new FormsIdentity(ticket);
            Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
            // Debug#2
        }
    }
}

Очевидно, я упростил, но это путь, по которому вы должны следовать, чтобы делать все правильно.

4 голосов
/ 27 июня 2011

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

Возможно, это вообще не связано с аутентификацией. Вы пытались сбросить значение Context.User.Identity.Name вместе с неверным результатом данных? Это также возвращает вам неправильное имя пользователя?

Можете ли вы воспроизвести проблему, если можете гарантировать, что на сайте активен только один пользователь?

...