Как добраться до коллекции 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);
Ответы
Ответ 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);