Azure AD JWT令牌中缺少应用程序权限范围
我们的应用程序正在管理Office 365日历,而无需获得使用Office 365 Exchange Online API的用户的明确同意。这与客户现有安装的预期效果相同,但对于新客户,对Exchange Online API的所有请求都会返回Azure AD JWT令牌中缺少应用程序权限范围,azure,office365,azure-active-directory,Azure,Office365,Azure Active Directory,我们的应用程序正在管理Office 365日历,而无需获得使用Office 365 Exchange Online API的用户的明确同意。这与客户现有安装的预期效果相同,但对于新客户,对Exchange Online API的所有请求都会返回401未经授权的响应。我们已经将范围缩小到JWT令牌中缺少的角色声明 我们的问题是,JWT中缺少的这个角色是否是一个bug,或者这是出于设计。也许Azure广告团队的人可以分享他们的想法 如何繁殖 在Azure广告中,我们创建了应用程序注册。已上载公钥,以
401未经授权的响应。我们已经将范围缩小到JWT令牌中缺少的角色声明
我们的问题是,JWT中缺少的这个角色是否是一个bug,或者这是出于设计。也许Azure广告团队的人可以分享他们的想法
如何繁殖
在Azure广告中,我们创建了应用程序注册。已上载公钥,以便通过ADAL4j进行身份验证。除此之外,还向Exchange Online授予了一些应用程序权限:
我们可以通过ADAL4j使用https://outlook.office365.com/
作为资源Id。JWT看起来像这样(删除了一些不相关的信息):
可以看出,JWT令牌中缺少属性roles
调用Exchange Online API时(例如https://outlook.office365.com/api/v2.0/users/user@tenant.onmicrosoft.com/calendars
),将JWT作为承载令牌发送,返回401未经授权的。x-ms-diagnostics
标题提到:
2000008;reason="The token contains no permissions, or permissions can not be understood.";error_category="invalid_grant"
预期行为
当使用旧的应用程序注册(如果我没记错的话,使用Azure Classic Portal创建)时,JWT确实包含一个角色
属性和我们请求的角色:
{
typ: "JWT",
alg: "RS256",
},
{
aud: "https://outlook.office365.com/",
iss: "https://sts.windows.net/yyy/",
app_displayname: "Test",
appid: "app-id",
roles: [
"Calendars.ReadWrite.All"
],
ver: "1.0"
}
在调用Exchange Online API时,使用此JWT作为承载令牌可以正常工作
变通办法
我们通过使用“授予权限”按钮注册新应用程序解决了此问题:
现在,Calendars.ReadWrite.All
角色出现在JWT中,因此一切都正常工作
问题:
在过去,我们从未执行过授予权限操作。此外,还提到(增加强调):
作为管理员,您还可以同意应用程序的
代表租户中的所有用户授予权限。
“管理同意”可防止出现“同意”对话框以供选择
租户中的每个用户,都可以由用户在Azure门户中完成
具有管理员角色。从您的应用程序的“设置”页面
应用程序,单击所需权限,然后单击授予
权限按钮
但是,“在所有邮箱中读取和写入日历”权限是应用程序权限,而不是委托的权限,如中所述
该解决方案是解决我们缺少的角色声明问题的正确解决方案,还是Azure AD端出现了其他问题?该解决方案是正确的解决方案。当您的应用程序需要应用程序权限时,管理员必须通过单击“授予权限”按钮(如您所做)或将管理员同意传递给登录URL来表示同意。这适用于AAD v1应用程序模型。对于AAD v2应用程序模型,有一种不同的方式获得管理员同意。更多信息
在过去(Azure Classic Portal),当您向应用程序添加应用程序权限时,会自动授予许可。新的Azure门户网站并非如此。谢谢@andresm53,这很有意义。“管理员同意”页面确实对此做了更好的解释:“如果您同意,此应用程序将被授予属于您组织中所有用户的资源的指定应用程序权限,并被授予属于已登录用户的资源的授权权限。”有些权限不需要管理员同意,但其他许可需要管理员的同意。您可以在门户中查看权限是否需要管理员同意。使用AADv1端点,“授予权限”按钮可以提前进行管理员同意。此外,应用程序权限用于客户端凭据流,而委托权限用于代表用户流,如代码授予流。
{
typ: "JWT",
alg: "RS256",
},
{
aud: "https://outlook.office365.com/",
iss: "https://sts.windows.net/yyy/",
app_displayname: "Test",
appid: "app-id",
roles: [
"Calendars.ReadWrite.All"
],
ver: "1.0"
}