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

mic*_*ael 6 iprincipal iidentity wif portable-class-library .net-4.5

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

我遇到的问题是这些类和WIF一般完全基于"声明"的概念,这很棒......但是这两个接口IPrincipalIIdentity没有.不仅如此,ClaimsPrincipal该类还具有一系列标识,而不仅仅是与之关联的单个标识.

  • IPrincipal有IdentityIsInRole成员.
  • IIdentity的有AuthenticationType,IsAuthenticatedName成员.

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

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

joh*_*yno 4

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

public interface IClaimsPrincipal : IPrincipal
Run Code Online (Sandbox Code Playgroud)

IPrincipal这意味着声明感知类型与使用和接口的旧代码兼容IIdentity。但为了让您的代码声明被意识到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;
Run Code Online (Sandbox Code Playgroud)