Dot-Net

如何訪問 WIF 4.5 中的 SecurityTokenHandlers 集合?

  • November 21, 2012

我正在遷移一個使用 Active Federation 和 WIF 3.5 的 ASP.Net 站點以使用 .Net 4.5。Windows Identity Foundation (WIF 3.5) 的功能現已完全集成到 .Net 4.5 框架中。

由於類已移至三個不同的名稱空間,因此主要是機械翻譯問題。我遇到問題的部分是GenericXmlSecurityToken將 STS 發布的內容轉換為 Claims Principal 以呼叫SessionAuthenticationModule.WriteSessionTokenToCookie. 缺少文件,我只需要找到 WIF 4.5 訪問方式FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers

以下是在 WIF 4.5 中無法編譯的 WIF 3.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);

修復結果相當簡單(如果不是很明顯)。

FederatedAuthentication.ServiceConfiguration.SecurityTokenHandlers

轉換為 WIF 4.5 為

FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers

唯一的其他變化是將ClaimsPrincipal.CreateFromIdentity(identity)工廠方法呼叫替換為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);

引用自:https://stackoverflow.com/questions/13499411