2012-08-27 3 views
3

При входе в систему я хочу сгенерировать новый SessionId. Я нашел one solution that works, но для этого требуются довольно хакерские вещи и требуется, чтобы в приложении была установлена ​​полная настройка безопасности TrustPolicy.Создание нового SessionId в ASP.NET

Есть ли другой способ достичь этого?

+0

Рамки на самом деле не настроены с помощью крючков для этого - вот почему решение, которое вы нашли, «хакерское». – Oded

+2

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

+0

Проблема с созданием нового файла cookie sessionId при выходе из системы, время идет, а следующий пользователь, который входит в этот браузер, всегда будет использовать этот sessionId, который является дырой в безопасности если кто-то записал sessionId в промежуточный период –

ответ

3

Похоже, это работает:

Session.Abandon(); 
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); 

Сняв, что печенье, новый сеанс с новым идентификатором сессии будет создан на сервере.

(Справка: Microsoft Support)

EDIT: Вот пример использования AJAX (с JQuery) для вызова кода сервера без обновления страницы - она ​​вызывает дважды, один раз, чтобы удалить первую сессию, и один раз, чтобы генерировать новый. Там может быть лучший способ, но это действительно работает.

function newSession() { 
    jQuery.ajax({ 
     type: "POST", 
     url: "WebForm1.aspx/ClearSession", 
     data: "{}", 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     success: function() { 
      jQuery.ajax({ 
       type: "POST", 
       url: "WebForm1.aspx/NewSession", 
       data: "{}", 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       success: function() { console.log("Success!"); }, 
       error: function (x, y, z) { 
        console.log("Failure!"); 
       } 
      }); 
     }, 
     error: function (x, y, z) { 
      console.log("Failure!"); 
     } 
    }); 
} 

И отделенного кода (для WebForms - вы также можете сделать это с помощью контроллера MVC):

[WebMethod] 
public static void ClearSession() 
{ 
    HttpContext.Current.Session.Abandon(); 
    HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); 
} 

[WebMethod] 
public static void NewSession() 
{ 
    HttpContext.Current.Session["x"] = 123; 
} 
+0

Это работает, но потребует перенаправления или что-то, что позволяет отправлять cookie клиенту, а затем клиент делает другой запрос сервера с пустым идентификатором. Я не могу придумать, как это сделать и не причинять вред пользователям при случайном обновлении страницы. –

+0

Вы можете сделать это с помощью AJAX, чтобы предотвратить многократное обновление, предполагая, что вам нужно включить javascript. См. Мое редактирование для образца. –

+0

Предупреждение: это не защищает от фиксации сеанса, что, вероятно, является причиной того, что OP хочет сгенерировать новый идентификатор. – MichaelD

0

Я в настоящее время рассматривает решение о конфигурации на основе, а не код, на основе одного. Я бы настроил либо веб-сервер, либо балансировщик нагрузки, чтобы отменить заголовки запросов и ответов, содержащие файлы cookie, только для страницы входа. Удалите заголовки «cookie» для заголовков запросов и «set-cookie» для заголовков ответов.

Каждый запрос (GET или POST) на страницу входа не содержит информации о файлах cookie, что заставляет ASP.NET создавать новый сеанс и, что более важно, новый идентификатор сеанса.

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

Смежные вопросы