你如何在便携式类库中使用IPrincipal和IIdentity?

时间:2014-05-21 18:43:29

标签: .net-4.5 wif portable-class-library iprincipal iidentity

使用WIF(Windows Identity Foundation)4.5,Microsoft创建了WindowsPrincipal类,这是一种ClaimsPrincipal类型。当然,这些类不可移植,但它们背后的接口是(IPrincipal)。实现IIdentity接口的ClaimsIndentity类也是如此。

我遇到的问题是这些类和WIF一般完全基于“声明”的概念,这很棒......但是两个接口IPrincipalIIdentity是不。不仅如此,ClaimsPrincipal类还有一组身份,而不只是一个与之关联的身份。

  • IPrincipal有IdentityIsInRole个成员。
  • IIdentity有AuthenticationTypeIsAuthenticatedName成员。

鉴于可移植类库只能访问这两个接口,如何获取实际声明呢?

此外,在极少数情况下,委托人具有多重身份,如何获得“非主要”身份?

1 个答案:

答案 0 :(得分:4)

Microsoft在Microsoft.IdentityModel.dll中提供了声明感知类型,这些类型不可移植(我希望 )。那些类型只是扩展了当前的身份类型IPrincipal

public interface IClaimsPrincipal : IPrincipal

这意味着声明感知类型与使用IPrincipalIIdentity接口的旧代码兼容。但要使您的代码声明感知,您必须添加对Microsoft.IdentityModel.dll的引用(不作为PCL提供)或从头开始编写。

如果要在处理声明感知类型的实例时测试旧代码的行为,您可以使用向下转换到IPrincipal接口:

IClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(new List<IClaimsIdentity>()
{
    new ClaimsIdentity("AuthType1"),
    new ClaimsIdentity("AuthType2")
});

IPrincipal principal = claimsPrincipal as IPrincipal;
IIdentity identity = principal.Identity;