了解Azure AD访问令牌流

时间:2019-04-04 01:48:21

标签: authentication oauth-2.0 azure-active-directory

我试图了解Azure Active Directory的OAuth访问令牌请求/响应流所涉及的各个步骤。

我创建了一个高级流程图来说明我认为正在发生的事情。

方案:Web应用程序想要使用Azure AD登录用户,获得用户阅读其电子邮件的权限,并尝试阅读该用户的电子邮件。

enter image description here

我不太清楚的事情:

  1. 访问令牌是否对我提到的所有信息(appid,范围,资源,用户ID)进行编码?
  2. 在步骤#7验证令牌时,为什么需要检查传入令牌的范围是否正确(email.read)?如果该应用程序已经具有read的电子邮件访问权限(在第3步和第4步中已获批准),为什么我们需要再次验证传入范围?如果该应用发送的访问令牌是用来对电子邮件进行计数的,那么我们不能使用该范围进行读取吗?因为我们知道该应用有权读取电子邮件,所以使用出于不同目的发出的访问令牌(验证appid)有什么害处?

1 个答案:

答案 0 :(得分:0)

首先恭喜您的出色发现。

现在要担心您在...

  1. 访问令牌是否对我提到的所有信息(appid,范围,资源,用户ID)进行编码

尽管您已经足够封闭,但是为了更加清楚,ResourceScope是相同的。如您所知,azure活动目录具有两个版本 V1.0 和版本 V.20 < / p>

  

Resource在V1.0中,已在V2.0中替换为Scope   定义用户访问域。

现在,让我们深入研究一下令牌实际包含的内容

根据您的问题,有许多OAuth 2.0 protocol supports in azure active directory,因此每种协议都有不同的解决方法。我正在为您解释两个。

Azure Active Directory v2.0和OAuth 2.0 resource owner password credential

ROPC令牌示例POSTMAN

让我们研究一下使用ROPC协议的令牌示例。请参见下面的屏幕截图=>

enter image description here

如果您查看https://jwt.io/处的令牌声明,就会得到答案

请参见以下屏幕截图:

enter image description here

在此协议中,我们有

  

appId,UserId,资源/范围以及图片上标记的更多信息。

但是所有其他令牌协议都不包含相同的信息。您也可以检查OpenID Connect协议令牌声明。

  1. 我们为什么需要再次验证传入范围?

OAuth设计用于以下情况:应用程序X需要访问由应用程序Y控制并属于用户A的资源(例如,“我的信息”或“我的电子邮件地址”或“我的日历”),用户A可能希望授予访问应用程序Y上的那些资源,但他不想将其实际的用户名/密码凭据提供给应用程序X。因此,访问令牌被用作应用程序Y上资源的备用凭据。访问令牌可以独立于用户名/密码凭据而撤消,并且理想情况下,访问令牌的范围应严格限制为仅允许访问特定资源。

使用OAuth 2进行身份验证过载会以可能具有风险的方式进行建模。查看上面的示例,并想象将其用于身份验证。如果应用程序X使用该访问令牌进行身份验证,则它将使用一个令牌来授予对应用程序Y上资源的访问权限,并使用它来授予对自己资源的访问权限。也许这很麻烦,因为重要的是我们知道通过OAuth 2授予访问令牌的行为意味着用户已成功通过身份验证。

问题是访问令牌没有说明最终用户为哪个应用程序进行身份验证。那么,如果应用程序Z还具有针对应用程序Y上用户A的资源的访问令牌,会发生什么情况?如果应用程序Z可以使应用程序X使用此访问令牌,则它可以访问应用程序X上用户A的资源。这很糟糕。用户A可能已经信任应用程序Z来访问其在应用程序Y上的资源,但是用户A肯定从未同意应用程序Z来访问其在应用程序X上的资源。有关更多说明,您可以参考here

另一个原因

根据我的经验,但是我不太确定我们是否经常更新我们的应用程序许可和访问范围,如果它不能始终进行检查,那么我们也将无法访问我们的最新凭据。您还可以引用一些不错的线程here