在.NET中,什么是“Principal”?

58
在谈论.NET中的身份时,我们有Principal的概念。有接口IPrincipal和与之一起的实现ClaimsPrincipal。我们甚至可以使用Thread.CurrentPrincipal随时访问该接口的一个实现实例。
现在,我从未理解过这个主体是什么。事实上,一开始我认为它代表了当前用户的身份。但事实并非如此,实际上还有另一个接口IIdentity以及实现ClaimsIdentity。我在MSDN上找到了以下信息:
引用: “主体对象代表代码正在运行的用户的安全上下文,包括该用户的身份(IIdentity)和他们所属的任何角色。”
但是,“代码正在运行的用户的安全上下文”真正意味着什么?我认为我还没有理解它所代表的含义。

2
https://msdn.microsoft.com/en-us/library/ftx85f8x.aspx - James
4个回答

32

在授权访问资源或运行某些代码时,仅知道哪个用户正在授权行动是不够的,还需要知道他们以什么角色进行授权。

可以将此视为提升 shell 的大致等效操作:尽管原始身份(用户账户)相同,但 shell 现在正在以不同的主体(具有更多权限)运行。

IIdentity 类型主要关注认证问题,即确认系统已知的身份确实属于想要在该身份下行事的代理人。这是授权任何事物的必要前提,但并非全部内容。


16

Principal是一种抽象的东西,封装了身份和角色,因此它是代码运行的安全上下文。这可以是Windows标识(即Windows或Active Directory用户帐户)和Windows“角色”,也称为“组”,也可以是独立于Windows用户和角色但仍可用于多个应用程序的身份/角色。第三,它还可以是在您的应用程序中定义的仅限自定义身份和角色的概念。

安全上下文不是静态的;通过调整Principal的角色,它可以被更改,因此给身份(用户)和在安全上下文下运行的应用程序提供更多或更少的特权。

以下是学习更多信息的好地方:https://msdn.microsoft.com/en-us/library/z164t8hs.aspx


13

描述已经说出来了,原则就是身份加角色。

实际上,这只是一件非常简单的事情。

public interface IPrincipal 
{
    IIdentity Identity { get; }
    bool IsInRole( string role );
}

将其抽象化的想法非常重要。虽然最初只有几个实现(包括 WindowsPrincipalRolePrincipalGenericPrincipal),但后来引入了其他实现方式(例如 ClaimsPrincipal)。许多旧代码可以无缝升级到新实现方式,获得所有好处,而不需要改变任何其他东西。


1
但是角色可以作为声明添加到基础身份中 - 鉴于此,为什么还需要“Principal”? - Dai
@Dai:可以将角色添加到支持声明的身份中。历史上,并非总是如此。 - Wiktor Zychla

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接