48

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

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

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

因此,UserPrincipalfrom 的System.DirectoryServices行为类似于IPrincipal但不是出于偶然或有意而为?

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

4

4 回答 4

72

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

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

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

于 2014-11-24T15:54:34.887 回答
16

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

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

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

于 2015-06-17T20:07:57.250 回答
11

正如MSDN 网站所说:

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

然而

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

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

高温高压

于 2015-10-14T18:33:08.223 回答
-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;
    }
}
于 2017-03-21T06:00:42.223 回答