15

我正在迁移一个使用 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);
4

1 回答 1

16

修复结果相当简单(如果不是很明显)。

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);
于 2012-11-21T18:07:49.660 回答