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

时间:2014-11-24 15:04:11

标签: c# .net iprincipal iidentity

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

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

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

因此,来自UserPrincipal的{​​{1}}是否与System.DirectoryServices行为相似,但不是偶然或意图实现的?

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

4 个答案:

答案 0 :(得分:55)

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

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

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:9)

正如MSDN site所说:

  

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

,而

  

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

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

HTH

答案 3 :(得分:-2)

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;
    }
}