Создать новый идентификатор сеанса (бесшовная передача идентификатора) - PullRequest
7 голосов
/ 27 октября 2011

Итак, я сталкиваюсь с интересной проблемой, связанной с внедрением идентификатора сеанса после входа в систему / изменения уровней доступа / и т. Д.

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

Для предотвращения перехвата сеанса (путем хранения первичного не-SSL-соединения) и фиксации сеанса мы должны сгенерировать новый идентификатор сеанса при входе в систему, но Microsoft, похоже, не позволяет вам этого делать (grr, так много читаемых только переменные и закрытые классы без конструкторов). Я мог бы просто перенести все данные в бэкэнд-SQL, но это кажется "грязным хаком".

Есть идеи, как правильно это сделать?

Редактировать:

Реализации, которые я нашел:

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

Сессия по-прежнему является старой сессией, поэтому на следующей странице все изменения будут потеряны.

SessionIDManager не возвращает объект сеанса после SaveSessionID, поэтому я не могу добавить детали к сеансу, который я только что создал. На следующей странице загрузить могу, но старый сеанс теперь недоступен (и отменен, но даже если он не был оставлен ...).

HttpContext.Session доступен только для чтения, даже если это не так, HttpSessionState не имеет конструктора.

Редактировать 2:

Фиксация сессии в ASP.NET

По-видимому, здесь уже обсуждались вопросы фиксации и перехвата сеанса, ответ был «Microsoft, похоже, не заботится», с плохо реализованным двухфазным исправлением.

Ответы [ 3 ]

1 голос
/ 27 ноября 2011

Хорошо, так что это небольшая проблема, показано, как вы можете перехватить аутентификацию на основе сеансов и аутентификацию на основе форм с помощью этого метода (вам понадобится действительная учетная запись пользователя, но вы можете захватить сеанс другого пользователя), естьнекоторые блоги в Интернете, которые жалуются на фиксацию сеансов и способность легко использовать угон.Очевидно, это огромная проблема. Яхья указал, что Microsoft не заинтересована в исправлении этого .

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


Одна вещь, которая была рекомендована, которая могла бы помочь, - это предотвратить любую не-ssl-связь, используя другое приложение в качестве не-ssl-интерфейса, который просто обслуживает 302 перенаправления, как рекомендовано Yahia , в то время какВо-первых, помогает предотвратить раскрытие идентификаторов сеансов, это потребует большой реструктуризации того, как приложения развертываются для исправления, и IMO: в первую очередь нужно исправить неправильное управление сеансами .NET, и яхотел, чтобы наши приложения были полностью защищены с нуля, не зависимо от того, чтобы другие приложения выполняли перенаправления 302, чтобы любая утечка информации не имела значения, поскольку cookie будет вращаться при входе в систему.

0 голосов
/ 18 апреля 2013

Мой ответ немного запоздал, но я искал те же самые вещи, поэтому я решил опубликовать то, что нашел ... Вместо того, чтобы использовать SessionIdManager для сброса cookie, казалось, что лучшим "крючком" было быустановить пользовательский менеджер идентификаторов сеансов:

<sessionState mode="InProc" ... 
              sessionIDManagerType="MyAssembly.SessionFixationIdManager, MyAssembly" />

Затем я реализовал свой ISessionIdManager, используя существующий SessionIdManager.Например:

class SessionFixationIdManager : ISessionIDManager
{
    private SessionIDManager _originalManager = new SessionIDManager();

    public string CreateSessionID(System.Web.HttpContext context)
    {
        // Default process for creating session IDs is fine...
        return _originalManager.CreateSessionID(context);
    }

    etc.
}

Единственный метод, который я сделал другим, был метод GetSessionID - если запрос не аутентифицирован, игнорируйте входящий cookie и выдайте новый:

public string GetSessionID(System.Web.HttpContext context)
{
    // Never use a session ID from an unauthenticated request...
    if (!context.Request.IsAuthenticated) 
        return null;

    return _originalManager.GetSessionID(context);
}

Делая это, вы гарантируете, что:

  1. Файл cookie идентификатора сеанса будет переиздан на ответ, который аутентифицирует пользователя.Я использую Аутентификацию по формам, так что это ответ, который выдает Cookie для аутентификации по формам.

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

Теперь это только начало усилий по обеспечению безопасности,Например, мне все еще нужно сделать что-то, чтобы связать сеанс с аутентифицированным пользователем (например, зашифровать некоторое значение сеанса в куки аутентификации форм).И это означает, что я не могу использовать Session State во время процесса входа в систему (все это должно обрабатываться как один запрос, или с использованием ViewState и т. Д.).

Но я думаю, что это гарантирует, что неаутентифицированный пользователь не сможет выполнить фиксацию сеанса.

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

0 голосов
/ 26 ноября 2011

Вы смотрели на FormsAuthentication.SetAuthCookie метод?

Попробуйте что-то вроде этого:

FormsAuthentication.SignOut();
HttpContext.Current.Session.Abandon();
FormsAuthentication.SetAuthCookie(newCode, true);

Надеюсь, это поможет вам ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...