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

我的问题是这些类以及WIF通常完全基于“声明”的概念,这真棒……但是两个接口(interface)IPrincipalIIdentity却不是。不仅如此,ClaimsPrincipal类还具有一组Identities,而不仅仅是与之关联的单个Identity。

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

  • 考虑到可移植类库只能访问这两个接口(interface)的事实,如何获得实际的声明?

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

    最佳答案

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

    public interface IClaimsPrincipal : IPrincipal
    

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

    如果要测试处理声明感知类型的实例时旧代码的行为,可以只使用向下转换到IPrincipal接口(interface):
    IClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(new List<IClaimsIdentity>()
    {
        new ClaimsIdentity("AuthType1"),
        new ClaimsIdentity("AuthType2")
    });
    
    IPrincipal principal = claimsPrincipal as IPrincipal;
    IIdentity identity = principal.Identity;
    

    关于.net-4.5 - 您如何在可移植类库中使用IPrincipal和IIdentity?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23791366/

    10-11 06:49