无法使用Azure AD和客户端凭据流为特定作用域请求OAuth2令牌



我们正在开发一个具有前端和后端的应用程序。后端应通过带有OAuth2令牌的Rest API访问。授权提供商是Azure AD.

在Azure中,我们创建了2个应用程序注册。一个用于API,一个用于客户端应用程序。API注册定义了3个作用域(读取、写入、删除(。客户端应用程序注册已为这些作用域委派了权限。

我们正在从客户端应用程序注册中请求具有clientID和clientSecret的令牌。

问题是,我们只能请求范围为api/.default的令牌。例如,api/read会导致无效的范围错误。但是,如果我们使用api/.default,则令牌中不包括scope(scp(属性。难道不需要检查使用API的应用程序是否拥有正确的权限吗?

我不确定我们是否做错了什么,或者我们是否有错误的理解/期望。

使用客户端凭据流获取Azure AD JWT令牌时,作用域必须采用格式

api://<clientid of the API app registered>/.default

根据MSDN,OAUTH客户端凭据流

scope-必需-此请求中为scope参数传递的值应为您想要的资源,附加有.default后缀。对于Microsoft图形示例,值为https://graph.microsoft.com/.default.这价值告诉微软标识平台您为应用程序(端点(配置的应用程序权限应该为与您的资源相关联的那些颁发令牌想要使用。要了解有关/.默认范围的更多信息,请参阅同意书文档

Azure AD返回的令牌中包含的声明取决于所使用的OAuth2授权类型。当使用客户端凭据流时,这意味着正在使用两个应用程序,它们都不涉及任何用户交互。Azure文档使用术语守护程序应用程序和web API应用程序。守护程序应用程序是调用web API应用程序的API的应用程序。

显而易见但不幸的是错误的方式是使用";暴露API";例如在Azure门户网站上:AD->应用程序->公开API以创建权限。问题在于;暴露API";仅创建委派权限。但是,只有当涉及到用户时,委派的权限才相关。使用客户端凭据授予时情况并非如此。

需要创建应用程序权限。目前看来,这些权限只能直接在清单中创建。创建应用程序权限需要以下内容:

  1. 转到AD中的Web API应用程序->单击清单
  2. 将appRoles字段更改为如下内容:
    {
    // ...
    "appRoles": [
    {
    "allowedMemberTypes": ["Application"],          // Must be "Application"
    "description": "Allows Read operation",
    "displayName": "Read",
    "id": "a35fcf6e-58c4-42af-937d-f43e90103b44",   // A unique UUID
    "isEnabled": true,
    "lang": null,
    "origin": "Application",
    "value": "Read"                                 // The role one wants to create
    }
    ]
    // ...
    }    
    
  3. 保存文件

更多信息也可以在Azure官方文档页面上找到受保护的web API:应用程序注册。

现在可以转到AD中的守护程序应用程序并授予创建的应用程序权限。在Azure门户中,这是通过以下步骤完成的:

  1. 转到AD中的Daemon应用程序
  2. 转到API权限
  3. 单击添加权限
  4. 选择我的API
  5. 选择Web API应用程序
  6. 选择应用程序权限
  7. 现在选择Daemon应用程序获得的权限
  8. 单击添加权限
  9. 通过单击授予管理员同意

守护程序应用程序现在可以使用客户端凭据授予来请求令牌。请求中的作用域必须为"/.default"。(只有对于委派权限,才能请求非默认作用域。(然后,返回的令牌将包含声明角色,这是一个已授予权限的列表。列表中的权限是授予Damon应用程序的权限。例如

"roles": ["Read"]

最新更新