Вопрос или проблема
Мне нужно применить 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
Объяснение:
-
Удаление старых куков: Для каждого существующего куки создается новый экземпляр
HttpCookie
, у которого устанавливается время истечения на прошедшую дату. Это позволит удалить старый куки из браузера. -
Установка пути куки: При создании нового куки важно установить его путь в ту же директорию, что и у оригинального куки, чтобы браузер правильно воспринимал новый куки.
-
Избежание дублирования: Теперь, после добавления нового куки с HMAC, старый куки будет удален перед завершением обработки
Session_Start
.
После внесения этих изменений ваши куки должны корректно обновляться с HMAC, без дублирования и с правильными настройками.
Если у вас возникнут дополнительные вопросы или понадобятся пояснения по коду, пожалуйста, дайте знать!