При первой попытке клиента получить доступ к защищенному ресурсу, размещаемому проверяющей стороной, данный клиент прежде всего должен пройти проверку подлинности для службы STS, которая является доверенной для проверяющей стороны. Затем STS выдает клиенту маркер безопасности. Клиент предъявляет этот маркер проверяющей стороне, и та предоставляет клиенту доступ к защищенному ресурсу. Однако такая ситуация, когда клиент вынужден повторно проходить проверку подлинности для службы STS для каждого запроса, является нежелательной, особенно с учетом того, что клиент и проверяющая сторона могут находиться на разных компьютерах или в разных доменах. Вместо этого WIF обеспечивает установку сеанса клиентом и проверяющей стороной, в ходе которого клиент использует маркер безопасности сеанса в целях проверки своей подлинности для проверяющей стороны для всех запросов, следующих после первого запроса. Проверяющая сторона может использовать этот маркер, хранимый в файлах Cookie, для воссоздания IClaimsPrincipal клиента. Дополнительные сведения см. в разделе "Принцип действия WSFAM" в Общие сведения о модуле федеративной проверки подлинности (WS-Federated Authentication Module).

Служба STS определяет, какой тип проверки подлинности должен предоставить клиент. Однако у клиента может быть несколько учетных записей, с которыми он может пройти проверку подлинности для службы STS. Например, клиент может иметь маркер из учетной записи Windows Live, имя пользователя и пароль, сертификат и смарт-ключ. В этом случае служба STS предоставляет клиенту несколько удостоверений, каждое из которых соответствует одному набору учетных данных, предъявленных клиентом. Проверяющая сторона может использовать одно или несколько из этих удостоверений для предоставления клиенту того или иного уровня доступа.

Маркер SessionSecurityToken используется для воссоздания участника IClaimsPrincipal клиента, содержащего все удостоверения клиента в коллекции ClaimsIdentityCollection. Каждое удостоверение IClaimsIdentity в коллекции содержит маркеры начальной загрузки, связанные с данным удостоверением.

Если выдается новый маркер сеанса с ИД сеанса исходного маркера, обработчик SessionSecurityTokenHandler не обновляет маркер сеанса в кэше маркеров. Экземпляр маркера сеанса всегда должен создаваться с уникальным ИД сеанса.

Примечание.
ReadToken вызывает исключение XmlException в случае получения недопустимых входных данных, например если файлы Cookie, включающие маркер сеанса, повреждены. Рекомендуется выявить это исключение и обеспечить соответствующую реакцию на события для конкретного приложения.

Если защищенная веб-страница содержит множество ресурсов (например, небольшие рисунки), которые также входят в защищенный домен, для загрузки каждого из этих ресурсов клиент должен пройти повторную проверку подлинности для проверяющей стороны. Использование маркера проверки подлинности сеанса позволяет избежать необходимости проходить проверку подлинности для службы STS для каждого запроса, однако это не означает, что множество файлов Cookie не будут отправляться по-прежнему. Веб-страницу можно настроить таким образом, чтобы важные данные и ресурсы хранились в защищенном домене, а менее существенные элементы — в незащищенном домене, к которому можно перейти по ссылкам на главной странице. Кроме того, можно задать путь к файлам Cookie таким образом, чтобы он ссылался только на защищенный домен.

Расширяемость

Механизм управления сеансом может быть расширен. Это может потребоваться, например, для увеличения производительности. Допустим, требуется создать пользовательский обработчик файлов Cookie, который будет преобразовывать или оптимизировать маркер безопасности сеанса между его состоянием в памяти и содержимым файлов Cookie. Для этого следует настроить свойство CookieHandler модуля SessionAuthenticationModule на использование пользовательского обработчика файлов Cookie, производного от обработчика CookieHandler. ChunkedCookieHandler является обработчиком файлов Cookie по умолчанию, поскольку размер этих файлов превышает допустимый размер для протокола HTTP; если вместо этого применяется пользовательский обработчик, необходимо прибегнуть к разделению на блоки.