使用来自服务主体的 oAuth 令牌进行身份验证,产生 "the audience is invalid" 错误

Authenticating with oAuth token from service principal, produces a "the audience is invalid" error

我正在使用另一个开发人员设置的服务主体进行身份验证。我正在尝试针对内部开发的 API 进行身份验证。 ASP 在其他开发者使用 SDK 进行身份验证时有效。但是当我尝试使用 Postman 时,我收到了 401 错误。

问题是我真的不知道该使用哪个资源。我相信客户端 ID、密码和范围是正确的。但我似乎无法找到有关要使用的资源类型的任何信息。对于内部开发的 API,有什么方法可以确定这一点?我已经使用了大量公开可用的。就像测试一样,因为我找不到任何信息。留空是不行的。

假设您在 azure ad 应用程序注册中创建了两个应用程序,一个代表客户端应用程序,另一个代表 api 应用程序,(或者在应用程序注册中您必须选择所需的客户端应用程序)然后您必须使用客户端应用程序来调用 Web api 应用程序。 注意:当您调用 web API 时,请确保您发送的是访问令牌(而不是 ID 令牌)

  1. 您跟踪在 jwt.io 中获得的令牌。 Azure AD 受众必须匹配“aud”声明。 Audience 必须等于为应用程序设置的 AppId 或客户端 ID。 检查 jwt.io 中令牌的 iss 值并查看登录版本 url。如果它是 v2,请在 API 的应用程序注册中将清单 json 设置为 2,因为它可能默认为 2。 “accessTokenAcceptedVersion”:2
  2. 在应用程序注册中,如果您公开的 api 类似于: api://xxxx-xxx-xxx ,那么您应用程序 appsettings.json 中的客户端 ID 必须是一样。

Note:Client id may be configured differently according to application. If above doesn't work try client ID : instead of api://

  1. 您可能需要为您的客户端应用程序授予应用程序权限(这是您自己定义的角色权限,您可以在我的APIs中找到它add permissions)。然后你需要点击admin consent按钮来授予administrator consent这个权限。

这里我暴露了作用域>> api://xxx-xxx-xxx/access_as_user。确保使用在门户中配置的相同范围包含在应用程序配置中。范围也应包括代码中公开资源的标识符(应用程序 ID URI)。 例如:范围:“api://xxxx-xxx-xxxx/access_as_user “

在 postman Set Authorization header 中引用全局变量 'Bearer {{bearerToken}}' 并将授权数据添加到 Request Headers, 如果您使用的是邮递员回调 uri,请在邮递员配置中取消选中授权使用浏览器进行回调url。(请参阅enable-azure-ad-authentication| csharpcorner