我试图了解Azure Active Directory的OAuth访问令牌请求/响应流所涉及的各个步骤。
我创建了一个高级流程图来说明我认为正在发生的事情。
方案:Web应用程序想要使用Azure AD登录用户,获得用户阅读其电子邮件的权限,并尝试阅读该用户的电子邮件。
我不太清楚的事情:
read
的电子邮件访问权限(在第3步和第4步中已获批准),为什么我们需要再次验证传入范围?如果该应用发送的访问令牌是用来对电子邮件进行计数的,那么我们不能使用该范围进行读取吗?因为我们知道该应用有权读取电子邮件,所以使用出于不同目的发出的访问令牌(验证appid)有什么害处?答案 0 :(得分:0)
首先恭喜您的出色发现。
现在要担心您在...
尽管您已经足够封闭,但是为了更加清楚,Resource
和Scope
是相同的。如您所知,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协议的令牌示例。请参见下面的屏幕截图=>
如果您查看https://jwt.io/处的令牌声明,就会得到答案
请参见以下屏幕截图:
在此协议中,我们有
appId,UserId,资源/范围以及图片上标记的更多信息。
但是所有其他令牌协议都不包含相同的信息。您也可以检查OpenID Connect协议令牌声明。
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