Как я могу переименовать имена файлов cookie сеанса по умолчанию в servicestack

#c# #security #cookies #servicestack #session-cookies

#c# #Безопасность #файлы cookie #servicestack #сеансовые файлы cookie

Вопрос:

ServiceStack имеет имена файлов cookie по умолчанию «ss-id», «ss-pid» и «ss-opt», определенные в SessionFeature.cs

Есть ли способ изменить имена по умолчанию на что-то другое?

Код конфигурации в HostConfig, похоже, не ссылается на него.

Был бы признателен за любые советы / указатели.

Ответ №1:

Как вы отметили в коде SessionFeature.cs, имена файлов cookie определены как const и не настраиваются пользователем.

Однако вы могли бы использовать фильтры для изменения имен файлов cookie на что-то более подходящее по запросу и ответу. Добавьте в свой метод настройки:

 const string mySessionIdentifier = "mySessionId";

// Converts incoming requests with "mySessionId" cookie to "ss-id"
PreRequestFilters.Add((IRequest httpReq, IResponse httpRes) =>
{
    var cookie = httpReq.Cookies[mySessionIdentifier];
    if (cookie != null)
    {
        httpReq.Cookies.Remove(mySessionIdentifier);
        httpReq.Cookies.Add(ServiceStack.Keywords.SessionId, cookie);
    }
}


// Converts responses with outgoing cookie "ss-id" to "mySessionId"
GlobalResponseFilters.Add((IRequest httpReq, IResponse httpRes, object dto) => {
    var cookies = httpRes.CookiesAsDictionary();
    string cookie;
    if (cookies.TryGetValue(ServiceStack.Keywords.SessionId, out cookie))
    {
        httpRes.DeleteCookie(ServiceStack.Keywords.SessionId);
        httpRes.SetCookie(new Cookie(mySessionIdentifier, cookie));
    }
});
  

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

Комментарии:

1. Приведет ли это к какому-либо снижению производительности, что сделает его статическим неконстантным свойством?

2. @joelharkes Я предполагаю, что вы говорите о SessionId в SessionFeature.cs : я думаю, это только const потому, что никто не выдвинул аргументы в пользу того, чтобы сделать его настраиваемым. Итак, я бы предположил, что это будет легко изменено на static свойство и настраивается пользователем без снижения производительности. Есть пара мест, где идентификатор файла cookie был встроен в клиент и функцию ServerSendEvents, которые нуждаются в обновлении, но если выдвигается предложение, такого рода изменения обычно происходят быстро.

3. Я думаю, что лучшим вариантом для его настройки является безопасность: имена файлов cookie могут указывать на серверную часть стека служб. Это облегчило бы хакеру атаку на систему.

4. @joelharkes Я вижу этот аргумент и думаю, что это веская причина — я за то, чтобы сделать его настраиваемым. Просто помните, что в сервисе ServiceStack есть множество других встроенных функций, которые будут отображать сервер как ServiceStack (страницы ошибок по умолчанию, формат исключений, маршруты синхронизации по умолчанию, метаданные, заголовки сервера, встроенные файлы, такие как ss-utils.js ). Итак, есть много аспектов, которые нужно скрыть, и это просто защита через неизвестность, всегда будут аспекты, которые раскрывают серверную часть.

5. Разрешение его конфигурирования нарушило бы работу клиентов, которые явно устанавливают файлы cookie сеанса. Имеет смысл согласовать константы, на которые можно положиться, особенно. когда они используются вне границ процесса.

Ответ №2:

Еще одним примером настраиваемых имен файлов cookie является то, что у вас может быть, скажем, сайт MVC на domain.com и API на api.domain.com. Если вы воспользуетесь возможностями сеанса servicestack в обоих (но с отдельными логинами), файлы cookie ss-id и т.д. будут бороться друг с другом на двух сайтах. Это имеет место в IE и Edge, где файлы cookie домена и поддомена всегда являются общими, тогда как в Chrome файлы cookie остаются отдельными.

У нас есть именно такая конфигурация — сайт MVC на domain.com и различные поддомены, на которых размещены API-интерфейсы для вариаций нашего приложения. Как только кто-то использовал IE, а не Chrome, это нарушило разделение файлов cookie между сайтом MVC и поддоменами.

К сожалению, приведенное выше решение фильтра не работает для интеграции servicestack с MVC. Для нас слишком поздно переключаться с domain.com в www.domain.com таким образом, в настоящее время мы не можем использовать хранилище сеансов servicestack на сайте MVC.

Я запросил изменение функции.