向一个五岁的孩子解释“基于声明的身份验证” 将用户身份验证比作进入游乐园需要一张门票,门票上写着你可以做什么和不能做什么。基于声明的身份验证就像门票上有很多标签,告诉工作人员你可以做哪些事情,这样他们就知道如何让你在游乐园里玩得开心而又安全。

205

好的,不是针对5岁儿童,但请尽可能避免使用流行语和企业用语。

现在似乎很流行基于声明的身份验证,但我找不到一个简单易懂、平易近人的解释,说明它到底是什么,与我们现在使用的角色-based身份验证有何不同,使用它的好处是什么等等。


2
我同意 @Marnix 的观点。既然你已经有了基本的理解,你可以更容易地理解 Microsoft 的定义/解释 - FrankO
如果你想花更多的时间和精力,我也发现这篇白皮书很简单明了。介绍回答了问题,图表则能说明一切:http://download.microsoft.com/download/7/D/0/7D0B5166-6A8A-418A-ADDD-95EE9B046994/Claims-Based%20Identity%20for%20Windows.pdf - Paweł Bulwan
Kentico还对此类术语有相当轻量级的解释 https://docs.kentico.com/k9/managing-users/user-registration-and-authentication/claims-based-authentication - Hoan Dang
6个回答

239
@Marnix 的回答相当不错,但要脱离技术方面来看:
基于声明的身份验证是关于定义您信任谁能为您提供准确身份信息,并且只使用提供的该信息。我的例子是在酒吧。想象一下你想在酒吧里喝啤酒。理论上,酒保应该要求您出示年龄证明。怎么证明呢?一种选择是让酒保把你从中间切开并数一下树轮,但这可能会有些问题。另一种选择是让您在一张纸上写下生日,由酒保批准或驳回。第三个选项是去政府部门申请身份证,然后向酒保展示身份证。
有人可能会嘲笑只是把你的生日写在纸上的想法,但是当您在应用程序内验证用户时,实际上就是这样做,因为这取决于酒保(或您的应用程序)相信这张纸。然而,我们相信政府断言身份证上的生日是有效的,并且身份证是请求饮料的人的。就实质而言,酒保(或应用程序)并不真正在意身份验证是如何发生的,因为我们信任它。酒保只需要知道您的出生日期,因为这就是酒保需要知道的全部。现在,酒保可以储存他们认为对他们重要的信息,比如你最喜欢的饮料,但政府并不关心(因为它不是权威来源),所以酒保以自己的方式储存那些信息。
基于声明的身份验证的关键是“谁是身份的权威来源?”

30
很棒的比喻!我希望能因为“把你劈成两半数树轮”的判断年龄方法给予额外的分数。我得试试看。 :-) - Keith Robertson
8
我经常看到人们错误地使用“for all intensive purposes”,所以当有人正确地说出“for all intents and purposes”时,我真的非常感激。 - JoeBrockhaus
3
简单来说,复杂话题的类比很难简化为简单的概念,无论你多么理解这些话题。另外,一个五岁的孩子为什么会关心基于声明的身份验证呢? - Steve
2
我阅读了这篇文章,似乎声明式身份验证是第三方认证系统,例如开放式认证或社交登录,如Microsoft帐户、Facebook、Twitter、Google。有人可以告诉我声明式身份验证与开放式认证有何不同吗?因为开放式认证也是第三方认证系统。 - Thomas
3
OAuth实际上是关于授权而非认证的,这会导致完全不同的对话。它们确实提供了身份识别信息,但其意图是使用令牌来访问其服务,而非识别用户。扩展一下,OpenID旨在进行身份识别。无论哪种情况,简单地想(虽然不完全准确)是它们只是CBA的实现。 - Steve
显示剩余6条评论

144

(这是我的个人看法,可能会有不同意见。请将其他观点发布为独立答案。)

基于声明的身份验证和授权是指通过将身份验证/授权变成一个单独的(网络)服务,将用户授权和用户登录维护工作从(网络)应用程序中分离出来。

例如,当我第一次浏览启用了声明的Web应用程序时,它会将我的浏览器重定向到一个可信任的“登录服务”上。我将对该服务进行身份验证(使用Windows身份验证、智能卡或其他方式),并作为响应,它将发送回一个“令牌”,该浏览器将其发送回Web应用程序。现在,Web应用程序检查令牌是否由其信任的登录服务数字签名,然后查看令牌中的“声明”。仅仅基于这些声明,应用程序就可以决定向用户提供哪些功能。

声明几乎总会包括用户的身份标识,通常还包括与授权相关的声明("此用户可以查看销售数据,但无法更新"),以及其他一些信息("鞋码=42")。

关键点是应用程序不知道也不关心用户是如何进行身份验证的,也不知道授权是如何进行管理的:它仅使用数字签名的令牌中的声明信息来确定用户是谁和/或用户可以看到或执行哪些操作以及/或有关用户的任何其他信息。

(是的,我在这里假设一个相当聪明和知情的5岁孩子。 :-))


6
“通过Facebook/Google等账户登录”这样的功能是否属于基于声明的身份验证(Claim-based authentication)的实例? - Wes
2
我相信我的五岁孩子能够理解所有这些。 - Sinaesthetic
@wes,你的问题有点模糊。仅仅使用Facebook或Google登录并不是声明式身份验证的例子。我还会争辩说,声明式身份验证并不存在。如果有的话,它应该是授权。CBA的作用在于使用这些提供程序进行登录时的授权步骤。当它要求权限并且您接受时,它将向您的访问令牌添加范围。这在语义上与声明不同,但通常以非常相似的方式使用。 - Sinaesthetic

46
下面这个现实世界的例子摘自《基于声明的身份验证和访问控制指南(第2版)》

一个非常熟悉的类比是你每次参观机场时遵循的身份验证协议。你不能简单地走到门口出示你的护照或驾驶执照。相反,你必须首先在售票柜台登记。在这里,你提供任何有意义的凭据。如果你要出国,你出示你的护照。对于国内航班,你出示你的驾驶执照。在验证你的照片ID与你的面孔匹配后(身份验证),代理商查找你的航班并验证你已经支付了机票费用(授权)。假设一切都没问题,你将收到一个登机牌,带到登机口。

登机牌信息非常详尽。登机口工作人员知道你的姓名和常旅客号码(身份验证和个性化),你的航班号和座位优先级(授权)甚至可能更多。登机口工作人员拥有完成他们工作所需的一切。

登机牌上也有特殊信息。它被编码在条形码和/或背面的磁条中。这些信息(如登机序列号)证明了该登机牌是航空公司发放的,而不是伪造品。

实质上,一个登机牌是航空公司关于你的一组声明的签名。它声明你被允许在特定的时间乘坐特定的航班并坐在特定的座位上。当然,代理商不需要深入思考这个问题。他们只需验证你的登机牌,阅读上面的声明,然后让你登机。

还要注意的是,可能有多种方式获得作为你登机牌的已签名声明集合。你可以去机场的售票柜台,也可以使用航空公司的网站,在家里打印你的登机牌。登机航班的代理人不在乎你选择哪种方式。

如何创建登机牌;他们不关心你用的是哪个发行方,只要航空公司信任它。他们只关心它是一个真实的声明集合,给予您上飞机的权限。

在软件中,这个声明集合被称为安全令牌。每个安全令牌都由创建它的发行方签名基于声明的应用程序将用户视为已通过身份验证,如果他们提供来自可信发行方的有效签名安全令牌


21

对于一个5岁的男孩,让他假设通过父母签署申请表加入了一所新学校。在学校管理部门批准他的申请后,他获得了一张包含以下所有信息的通行证,我们可以称之为进入学校的声明(CLAIMS)。

  1. 男孩的名字是BOB。
  2. 学校名称是MONTISSORI高中。
  3. 班级是8年级。

第一天上学时,当他走进学校时,他刷了一下通行证,大门打开了,这意味着他已被认定为学校的成员之一。这样他就成为了进入学校的验证人(AUTHENTICATED PERSON)。

到达他的教室后,他使用通行证进入每个教室,但是只有8年级的教室门开了,因为他声称自己是从8年级来的。

在学校里,他仅被授权进入自己的班级,因为他现在正在学习8年级。如果他尝试进入6年级,学校老师将不会授权他进入。


3
这只是描述了认证和授权的一般概念,没有特别提到基于声明或其他方式。 - Sheepy
Sheepy,他被拒绝进入六年级,这是否可以解释为他是八年级的原因? - Ian
1
我阅读了这篇文章,它似乎表明基于声明的身份验证是第三方认证系统,例如开放认证或社交登录,如 Microsoft Account、Facebook、Twitter、Google。有人可以告诉我基于声明的身份验证与开放认证有什么不同吗?因为开放认证也是第三方认证系统。 - Thomas

15
尽可能非技术性地说,如果您要描述有关自己以及您被允许看到或做什么方面的任何内容,每个这样的事情都是您“声称”为真实的事情,因此列表中的每个“事项”都将成为一个“声明”。
每当您告诉某人有关自己的事情,或“声明”您被允许看到或做某事时,您会向他们提供您的声明列表。他们将与权威机构核实您的声明是否属实,如果是,则会相信该声明列表中的所有内容。因此,如果您声称自己是Brad Pitt,您的声明列表将表明您是Brad Pitt,并且已通过权威机构验证了您的所有声明均为真实-- 那么他们将相信您是Brad Pitt以及列表中的其他任何内容。
“声明”:您宣称为真实的内容。这可以是一条信息或您声称拥有的权限的描述。您向其呈现声明的系统只需要理解声明的内容/意义并能够与权威机构进行验证。
“权威机构”:将您的声明列表组合在一起并签署的系统,基本上表示“凭我的权威,在此清单中的所有内容均为真实的”。只要阅读声明的系统可以与权威机构验证签名正确,那么声明列表中的所有内容都将被认为是真实和正确的。
此外,请不要称其为“基于声明的身份验证”,而应将其称为“基于声明的身份”。
略微更具技术含量:
因此,在这个过程中,您使用某种机制(用户名/密码、客户端密钥、证书等)进行身份验证,然后得到一个令牌,该令牌证明您是自己所声称的人。然后,您将交换该访问令牌以获取ID令牌。该过程将使用您的身份查找和构建声明列表,对其进行签名,然后将所有声明返回给您的ID令牌。
在授权步骤中,根据实现方式的不同,资源将查看您的ID令牌(声明),然后检查您是否具有访问该资源所必需的声明。
例如,如果资源“CastleBlack / CommandersTower”表示“您必须具有进入城堡黑色并且是领主指挥官的权限”,那么它将查看您的声明列表,以查看这两个条件是否成立。
正如您所看到的,“声明”可以是任何东西。它可以是角色,可以是事实,也可以是标志。它只是一个键值对的列表,“值”是可选的。有时只是看声明是否存在。
claims : [
    {"type": "name", "value": "Jon Snow"},
    {"type": "home", "value": "Winterfell, The North, Westeros"},   
    {"type": "email", "value": "jon@nightswatch-veterans.org"},
    {"type": "role", "value": "veteran;deserter;"},
    {"type": "department", "value": "none"},    
    {"type": "allowEntry", "value": "true"},
    {"type": "access", "value": "castleblack;eastwatch;"}
]

如果Jon登录并尝试访问上述资源,他将被拒绝,因为虽然他是他所说的人,并且他确实可以访问黑城堡,但他不再是统领,也没有明确进入统领之塔的权限,因此无法隐式地进入统领之塔。

更具体地说,“城堡黑色”可能是一个[更大]的范围,而每个区域都是一个特定的权限,但这是另一个讨论。

每个应用程序如何处理访问将有所不同,但它会使用声明来完成。


1
没有更多的点赞了吗?我认为这是一个完美的答案,因为我正在寻找“脚踏实地”的例子,以便如何将声明信息传递给我的Angular应用程序。这里的答案回答了两个问题(如何保护API,如何通知其他软件/客户端/ SPA使用该信息)。谢谢! - Simon

7
考虑到声明是告诉您有关用户的信息(姓名、年龄、种族等),因此您需要与安全令牌服务一起工作来验证这些声明,并在身份验证之外还将其用于授权。
下面摘自维基百科(http://en.wikipedia.org/wiki/Claims-based_identity)的内容是我目前发现的最好的类比:
“为了更好地理解安全令牌服务的概念,请考虑一个有门卫的夜总会的类比。门卫希望防止未成年人入内。为了实现这一点,他要求顾客出示由可信第三方(安全令牌服务)颁发的驾照、健康保险卡或其他身份证明(令牌),例如省级或州级车辆许可部门、卫生部门或保险公司。因此,夜总会免除了确定顾客年龄的责任。它只需要相信颁发机构(当然也要判断所提供令牌的真实性)。完成这两个步骤后,夜总会已成功地验证了顾客的身份,以便确认他或她已达到合法饮酒年龄。”
延续这个比喻,夜店可能会有一个会员制度,某些成员可能是常客或VIP。保安可能会要求另一枚令牌——会员卡,这可能会提出另一项要求;即该会员是VIP。在这种情况下,令牌的可信颁发机构可能是该俱乐部本身。如果会员卡声称顾客是VIP,则俱乐部可以相应地做出反应,将经过身份验证的VIP会员声明转换为权限,例如允许顾客坐在独家休息区并享受免费饮料。

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