Заменить или удалить и добавить новые сессионные куки.

Вопрос или проблема

Мне нужно применить HMAC к куки в приложении на vb.net.

Я вижу, что одним из лучших способов для этого является применение в Global.asax.vb.

После нескольких попыток мне удалось добавить куки с помощью этого кода:

    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' Срабатывает при запуске сессии
        Dim context As HttpContext = HttpContext.Current
        Dim cookies As HttpCookieCollection = context.Request.Cookies
        For Each cookie As String In cookies.AllKeys
            Dim currentCookie As HttpCookie = cookies(cookie)
            Dim hmac As String = CalculateHMAC(currentCookie.Value, "secretKey")
            Dim newCookie As New HttpCookie(cookie, currentCookie.Value & ":" & hmac)
            context.Response.SetCookie(newCookie)
        Next
    End Sub

    Function CalculateHMAC(ByVal message As String, ByVal key As String) As String
        Dim encoding As New ASCIIEncoding()
        Dim keyByte() As Byte = encoding.GetBytes(key)
        Dim messageBytes() As Byte = encoding.GetBytes(message)
        Dim hmacsha As New HMACSHA256(keyByte)
        Dim hashmessage() As Byte = hmacsha.ComputeHash(messageBytes)
        Return Convert.ToBase64String(hashmessage)
    End Function

НО проблема в том, что куки дублируются: оригинальные без HMAC и вторые с HMAC. Также я заметил, что для новых куки путь выглядит как /webName, а для оригинальных только /.

Я пробовал несколько способов, таких как добавление отрицательной даты истечения срока, использование context.Response.Remove(cookie), но ничего не удаляет оригинальные куки.

            currentCookie.Expires = DateTime.Now.AddDays(-1)
            context.Response.SetCookie(newCookie)

Что-то вроде этого, но ничего не работает. Кажется, я почти на месте! Но я не могу разобраться.

            currentCookie.Expires = DateTime.Now.AddDays(-1)
            context.Response.SetCookie(newCookie)

Ответ или решение

Чтобы успешно заменить существующие сеансовые куки в вашем приложении VB.NET, применив к ним HMAC, необходимо не только создать новые куки с HMAC, но и удалить старые, чтобы избежать дублирования. Давайте рассмотрим подход, который поможет вам достичь данной цели.

Ваша текущая реализация создает новые куки с HMAC, но не удаляет оригинальные куки, а также может возникать проблема с путями куки. Вам нужно убедиться, что новые куки имеют тот же путь, что и оригинальные.

Вот исправленный код с учетом ваших требований:

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Срабатывает при начале сессии
    Dim context As HttpContext = HttpContext.Current
    Dim cookies As HttpCookieCollection = context.Request.Cookies

    ' Итерация по всем текущим кукам
    For Each cookieName As String In cookies.AllKeys
        Dim currentCookie As HttpCookie = cookies(cookieName)
        If currentCookie IsNot Nothing Then
            ' Вычисление HMAC для текущего значения куки
            Dim hmac As String = CalculateHMAC(currentCookie.Value, "secretKey")
            ' Создание нового куки с HMAC
            Dim newCookie As New HttpCookie(cookieName, currentCookie.Value & ":" & hmac)
            ' Установка пути куки так же как у оригинального куки
            newCookie.Path = currentCookie.Path

            ' Удаление старого куки
            Dim expiredCookie As New HttpCookie(cookieName) With {
                .Expires = DateTime.Now.AddDays(-1),
                .Path = currentCookie.Path
            }
            context.Response.Cookies.Add(expiredCookie)

            ' Установка нового куки
            context.Response.SetCookie(newCookie)
        End If
    Next
End Sub

Function CalculateHMAC(ByVal message As String, ByVal key As String) As String
    Dim encoding As New ASCIIEncoding()
    Dim keyByte() As Byte = encoding.GetBytes(key)
    Dim messageBytes() As Byte = encoding.GetBytes(message)
    Dim hmacsha As New HMACSHA256(keyByte)
    Dim hashmessage() As Byte = hmacsha.ComputeHash(messageBytes)
    Return Convert.ToBase64String(hashmessage)
End Function

Объяснение:

  1. Удаление старых куков: Для каждого существующего куки создается новый экземпляр HttpCookie, у которого устанавливается время истечения на прошедшую дату. Это позволит удалить старый куки из браузера.

  2. Установка пути куки: При создании нового куки важно установить его путь в ту же директорию, что и у оригинального куки, чтобы браузер правильно воспринимал новый куки.

  3. Избежание дублирования: Теперь, после добавления нового куки с HMAC, старый куки будет удален перед завершением обработки Session_Start.

После внесения этих изменений ваши куки должны корректно обновляться с HMAC, без дублирования и с правильными настройками.

Если у вас возникнут дополнительные вопросы или понадобятся пояснения по коду, пожалуйста, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...