Использование ServiceStack ISession
ServiceStack имеет новый ISession
интерфейс, поддерживаемый ICacheClient
, который позволяет вам совместно использовать те же ISession
между контроллерами MVC, базовыми страницами ASP.NET и веб-службами ServiceStack, которые используют один и тот же идентификатор cookie, позволяя вам свободно обмениваться данными эти веб-фреймворки.
Примечание: ISession - это чистая реализация , которая полностью обходит существующий сеанс ASP.NET с собственными компонентами ServiceStack, как описано в ServiceCtack MVC PowerPack и подробно объяснено в Вики-страница сессий .
Чтобы легко использовать сессию ServiceStack (Cache & JSON Serializer), ваши контроллеры наследуют от ServiceStackController (в MVC) или PageBase (в ASP.NET)
В ServiceStack также добавлены новые функции аутентификации / проверки, о которых вы можете прочитать в вики:
Использование сеанса ASP.NET
По существу ServiceStack - это просто набор облегченных IHttpHandler , работающих на хосте ASP.NET или HttpListener. Если он размещен в IIS / ASP.NET (чаще всего), он работает как обычный запрос ASP.NET.
Ничто в ServiceStack не обращается и не влияет на настроенных поставщиков кэширования и сеансов в базовом приложении ASP.NET. Если вы хотите включить его, вам нужно настроить его как обычно в ASP.NET (то есть за пределами ServiceStack), см .:
http://msdn.microsoft.com/en-us/library/ms178581.aspx
После настройки вы можете получить доступ к сеансу ASP.NET внутри веб-службы ServiceStack через синглтон:
HttpContext.Current.Session
Или альтернативно через базовый ASP.NET HttpRequest с:
var req = (HttpRequest)base.RequestContext.Get<IHttpRequest>().OriginalRequest;
var session = req.RequestContext.HttpContext.Session;
Хотя из-за обязательной зависимости от конфигурации XML и ухудшенной производительности по умолчанию , я предпочитаю избегать использования сеанса ASP.NET, вместо этого выбрав очиститель Клиенты кэша включен в ServiceStack.
В основном способ работы Sessions (включая ASP.NET) - это файл cookie, содержащий уникальный идентификатор , добавляемый в Response, однозначно идентифицирующий сеанс браузера. Этот id указывает на соответствующий словарь / коллекцию на сервере, который представляет сеанс браузера.
Интерфейс IRequiresSession , на который вы ссылаетесь, по умолчанию ничего не делает, это просто способ сообщить либо пользовательскому фильтру запросов, либо базовой веб-службе, что этот запрос должен быть аутентифицирован (т.е. два места, где вы должны поместить логику проверки / аутентификации в ServiceStack).
Вот реализация Basic Auth , которая проверяет, является ли веб-служба безопасной и, если это так, убедитесь, что они аутентифицированы.
Вот другая реализация аутентификации , которая вместо этого проверяет все службы, отмеченные атрибутом [Аутентификация] , и как включить Аутентификацию для вашей службы , добавив Атрибут по вашему запросу DTO.
Новая модель аутентификации в ServiceStack
Вышеприведенная реализация отличается от модели поставщика с множественной аутентификацией, включенной в следующую версию ServiceStack. Вот справочный пример , показывающий, как зарегистрировать и настроить новую модель Auth в вашем приложении.
Стратегии аутентификации
Новая модель Auth полностью удобна, так как вы можете просто не использовать ее и реализовать аналогичное поведение самостоятельно, используя Фильтры запросов или базовые классы (путем переопределения OnBeforeExecute ). Фактически, новые сервисы Auth фактически не являются встроенными в ServiceStack как таковые. Вся реализация находится в дополнительном проекте ServiceStack.ServiceInterfaces и реализована с использованием пользовательских фильтров запросов.
Вот различные стратегии аутентификации, которые я использовал на протяжении многих лет:
Отметьте службы, которым требуется аутентификация, с помощью [Атрибут] . Вероятно, самый идиоматический способ C #, идеальный, когда идентификатор сессии передается через Cookie.
Особенно вне веб-контекста, иногда с использованием более явного интерфейса IRequiresAuthentication лучше, поскольку он обеспечивает строго типизированный доступ к User и SessionId, необходимому для аутентификации.
Вы можете просто иметь 1-полосную подпись для проверки подлинности на каждом сервисе, который в этом нуждается, - на временной основе. Подходящий подход, когда у вас очень мало служб, требующих аутентификации.