【问题标题】:What is the idea behind IIdentity and IPrincipal in .NET.NET 中 IIdentity 和 IPrincipal 背后的想法是什么
【发布时间】:2015-01-22 08:13:53
【问题描述】:

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

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

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

因此,System.DirectoryServices 中的UserPrincipal 的行为是否与IPrincipal 类似,但不是偶然或有意实现的?

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

【问题讨论】:

  • 您是否阅读过许多其他人的以下文章msdn.microsoft.com/en-us/library/ee748503.aspx您不明白什么..?尝试阅读 `PrincipalContect 以及我认为您将更好地了解如何以及为什么
  • Active Directory Principal 类与核心 .NET 框架中的 IIdentityIPrincipal完全没有关系。它们是完全独立的,在任何形式、形状或形式上都没有关联(除了命名......)
  • 当然,Active Directory 主体不依赖于 IPrincipal,但我认为存在隐式连接。例如:比较 IPrincipal.IsInRole(string role) 和 UserPrincipal.IsMemberOf(GroupPrincipal group)。我认为可以围绕 UserPrincipal 编写自定义 IPrincipal 包装器
  • 应该注意的是,绝对没有理由如果你真的想创建一个实现IPrincipalIIdentity 的具体类型,那是完全没有理由的。 public class MyIdentityMergedWithPrincipal : IPrincipal, IIdentity。另一方面,如果接口被整合成一个,您将无法像现在那样(并且可能应该)将它们分开。单独的接口用于单独的关注点。

标签: c# .net iprincipal iidentity


【解决方案1】:

IIdentity 仅用于用户的经过身份验证的身份,无论他们可能拥有什么角色。

IPrincipal 用于将用户的身份与他们在给定安全上下文中的授权角色结合起来。

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

【讨论】:

  • 所以,有 are 用于区分身份验证和授权问题。谢谢你的例子,现在我看到它们不能相互依赖,因此是独立的实体。
  • 我发现的一个混淆点是,人们经常将与身份相关的属性(例如姓名、电子邮件)放在 IPrincipal 实现而不是 IIdentity 上,因为他们懒得输入例如User.Identity.Email(在 Intellisense 和自动完成的时代),宁愿节省一些击键并输入 User.Email。
  • 那为什么IIdentityIsAuthenticated 属性?
  • 未经身份验证的用户仍然可以拥有与他们关联的IIdentity,在这种情况下,IsAuthenticated 属性将为false(例如,匿名网站访问者)。
【解决方案2】:

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

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

那么 IPrincipal 和 IIDentity 之间有什么区别? IPrincipal 是安全上下文(用于单个线程),而 IIDentity 是与来自特定身份提供者/授权的该用户相关联的一组属性。

【讨论】:

    【解决方案3】:

    正如MSDN site 所说:

    identity 对象封装了有关正在验证的用户或实体的信息。在最基本的层面上,身份对象包含名称和身份验证类型。

    principal 对象表示代码运行的安全上下文。

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

    HTH

    【讨论】:

      【解决方案4】:
      public class HBPrincipal : IPrincipal
      {
           private HBIdentity _identity;
      
           public HBPrincipal(HBIdentity identity)
          {
              _identity = identity;
          }
      
          public IIdentity Identity
          {
              get
              {
                  return _identity;
              }
          }
      
          public bool IsInRole(string role)
          {
              // TODO implement roles
              return false;
          }
      }
      

      【讨论】:

      • 这似乎根本无法回答问题。
      • 这需要一些描述,说明您在此处实际尝试向 OP 传达的内容。
      最近更新 更多