在WIF (Windows Identity Foundation) 4.5中,微软创建了WindowsPrincipal
类,这是ClaimsPrincipal
的一种类型。当然,这些类是不可移植的,但是它们背后的接口是(IPrincipal
)。实现IIdentity
接口的ClaimsIndentity
类也是如此。
我的问题是,这些类,和WIF一般是完全基于"索赔"的概念,这是可怕的…而IPrincipal
和IIdentity
两个接口则不是。不仅如此,ClaimsPrincipal
类也有一个身份的集合,而不是一个单一的身份与它相关联。
- IPrincipal有
Identity
和IsInRole
成员。 - IIdentity有
AuthenticationType
、IsAuthenticated
和Name
成员。
考虑到可移植类库只能访问这两个接口,如何获得实际的声明呢?
另外,在主体具有多个身份的罕见情况下,如何获得"非主"身份?
微软在Microsoft.IdentityModel.dll
中提供了声明感知类型,这是不可移植的(还,我希望)。这些类型只是扩展了当前的标识类型,例如IPrincipal
:
public interface IClaimsPrincipal : IPrincipal
这意味着声明感知类型与使用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;