在.NET中IIdentity和IPrincipal背后的想法是什么?

Alo*_*man 44 .net c# iprincipal iidentity

那么,什么是两个存在的目的IIdentityIPrincipal,而不是一些IIdentityMergedWithPrincipal?什么时候在同一个类中实现它们是不够的?

另外,为了理解目的,我想知道这个概念来自哪里:

  • 它起源于.Net
  • Identity/Principal的概念是设计模式,System.Security.Principal在这些接口中实现
  • 它起源于其他地方并支持兼容性

因此,不UserPrincipalSystem.DirectoryServices的行为类似IPrincipal,但不是偶然的还是打算实现它?

PS我正在寻找理念背后的推理,而不是利益/争议比较,所以请尽量不要开始基于意见的讨论

Mar*_*ade 62

IIdentity只是用于用户的身份验证身份,无论他们可能具有什么角色.

IPrincipal用于将用户的身份与他们在给定安全上下文中具有的授权角色相结合.

例如,您可以使用第三方登录提供程序(如Facebook或Google)来获取用户的身份,但您不会从这些提供程序中获取委托人,因为他们不提供任何角色.您可以使用自己的应用程序或第三方基于角色的授权提供程序将角色应用于FacebookIdentity或等GoogleIdentity.不同的应用程序可以期望具有自己的角色的不同主体,但仍然使用与另一个应用程序中相同的标识.

  • 未经身份验证的用户仍然可以拥有与他们相关联的"IIdentity",在这种情况下,"IsAuthenticated"属性将为"false"(例如,匿名网站访问者). (4认同)
  • 我发现的一个混乱点是,人们经常在IPrincipal实现而不是IIdentity上放置与身份相关的属性(例如姓名,电子邮件),因为他们不能打扰输入例如User.Identity.Email(在智能感知和自动完成的日子里,宁愿保存几个按键并输入User.Email. (3认同)
  • 因此,有**用于分隔身份验证和授权问题。谢谢您的示例,现在我看到它们不能彼此依赖,因此是独立的实体。 (2认同)

小智 13

主体是用户的安全上下文.

在.NET的情况下,主体支持具有多个身份的概念(这与声明无关).当涉及到开发人员在用户身份方面需要处理的语义时,这一点尤为重要.作为开发人员,您可能会被要求支持来自不同来源(身份提供商IdP)的多个身份,例如:Twitter,Google等等.

那么IPrincipal和IIDentity有什么不同呢?IPrincipal是安全上下文(对于单个线程),IIDentity是与来自特定身份提供者/授权机构的该用户相关联的属性集.


Kam*_*ran 10

正如MSDN网站所说:

身份对象封装被验证有关用户或实体的信息.在最基本的级别,身份对象包含名称和身份验证类型.

主要对象表示代码在其下运行的安全上下文.

有关更多信息,请参阅上面的链接.

HTH