Подтвердить что ты не робот

Как добраться до коллекции SecurityTokenHandlers в WIF 4.5?

Я переношу сайт ASP.Net, который использует Active Federation и WIF 3.5 для использования .Net 4.5. Функциональность Windows Identity Foundation (WIF 3.5) теперь полностью интегрирована в .Net 4.5 Framework.

Поскольку классы переместились в три разных пространства имен, это в основном вопрос механического перевода. Часть, с которой у меня возникают проблемы, заключается в переводе GenericXmlSecurityToken, выпущенном STS, к Принципу претензий для вызова SessionAuthenticationModule.WriteSessionTokenToCookie. Документация отсутствует, и мне просто нужно найти способ WIF 4.5 для доступа к FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers

Вот фрагмент кода WIF 3.5, который не компилируется в WIF 4.5 (создание WSTrust-канала опущено для краткости):

var genericToken = channel.Issue(rst) as GenericXmlSecurityToken;

var handlers = FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers;

var token = handlers.ReadToken(new XmlTextReader(new StringReader(genericToken.TokenXml.OuterXml)));
var identity = handlers.ValidateToken(token).First();

var sessionToken = new SessionSecurityToken(ClaimsPrincipal.CreateFromIdentity(identity),
                                            TimeSpan.FromMinutes(20));

FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);
4b9b3361

Ответ 1

Исправление оказалось довольно простым (если не сразу очевидно).

FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers

переводится в WIF 4.5 как   

FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers

Единственное другое изменение заключалось в замене вызова метода ClaimsPrincipal.CreateFromIdentity(identity) factory с помощью new ClaimsPrincipal(identity).

Ниже приведен рабочий фрагмент:

var handlers = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers;

var token = handlers.ReadToken(new XmlTextReader(new StringReader(genericToken.TokenXml.OuterXml)));
var identity = handlers.ValidateToken(token).First();

var sessionToken = new SessionSecurityToken(new ClaimsPrincipal(identity),
                                            TimeSpan.FromMinutes(20));

FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);