当我尝试验证用户是不是存在于 Azure Active Directory 中时,如何解决 Invalid Audience?

Posted

技术标签:

【中文标题】当我尝试验证用户是不是存在于 Azure Active Directory 中时,如何解决 Invalid Audience?【英文标题】:How to resolve Invalid Audience when I trye to verify if a user exists in Azure Active Directory?当我尝试验证用户是否存在于 Azure Active Directory 中时,如何解决 Invalid Audience? 【发布时间】:2022-01-20 09:45:31 【问题描述】:

阅读 Microsoft Graph 的文档,我找到了一个连接到 Azure Active Directory 并验证之前注册的用户是否存在的示例。

问题是当我尝试执行请求时,示例会抛出此错误:

Graph service exception Error code: InvalidAuthenticationToken
Error message: Access token validation failure. Invalid audience.

我的代码实际上与文档显示的操作相同。这是代码:

List<String> scopes = new ArrayList<String>();


String clientId = "XXXXXXX";
String clientSecret = "YYYYYYYY";
String tenantId = "ZZZZZZZZZ";

String permissions = "api://" + clientId + "/.default";


scopes.add(permissions);

final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
        .clientId(clientId)
        .clientSecret(clientSecret)
        .tenantId(tenantId)
        .build();


final TokenCredentialAuthProvider tokenCredentialAuthProvider =
        new TokenCredentialAuthProvider(scopes, clientSecretCredential);


final GraphServiceClient graphClient =
        GraphServiceClient
                .builder()
                .authenticationProvider(tokenCredentialAuthProvider)
                .buildClient();

User resultUser =  null;

try 
    UserCollectionPage ucp = graphClient.users().buildRequest().filter(
            "startsWith(mail,'" + email + "')").get();


    List<User> result = ucp.getCurrentPage();
    User u = result.get(0);
    return new ResponseEntity<>(resultUser, HttpStatus.OK);

catch (IndexOutOfBoundsException e) 

与 Azure Active Directory 的连接看起来很好,因为它在使用凭据登录连接后显示成功:

2021-12-16 21:38:10.994  INFO 28072 --- [onPool-worker-1] 
c.azure.identity.ClientSecretCredential  : 
Azure Identity => getToken() result for scopes api://570f77fe-098f-42cd-8a22-a29fa1d9c7c0/.default: SUCCESS

我想向您展示的另一件事是解码的令牌,它可以帮助我提供解决方案:

代币:

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1yNS1BVWliZkJpaTdOZDFqQmViYXhib1hXMCIsImtpZCI6Ik1yNS1BVWliZkJpaTdOZDFqQmViYXhib1hXMCJ9.eyJhdWQiOiJhcGk6Ly81NzBmNzdmZS0wOThmLTQyY2QtOGEyMi1hMjlmYTFkOWM3YzAiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC8zOTdlZDAzMS0zOTM1LTQwYjAtOWM2OS0xNGZkMTE2NGRiOGYvIiwiaWF0IjoxNjM5NzA4Mzk5LCJuYmYiOjE2Mzk3MDgzOTksImV4cCI6MTYzOTcxMjI5OSwiYWlvIjoiRTJaZ1lOaTJjRGEveHRHMmZldTAxUTdxVHI1MUFnQT0iLCJhcHBpZCI6IjU3MGY3N2ZlLTA5OGYtNDJjZC04YTIyLWEyOWZhMWQ5YzdjMCIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzM5N2VkMDMxLTM5MzUtNDBiMC05YzY5LTE0ZmQxMTY0ZGI4Zi8iLCJvaWQiOiJiMmRlYTQ3NS1lODlhLTRiNjQtOGM5Mi0yMTg4MGM5ODhmMTYiLCJyaCI6IjAuQVNrQU1kQi1PVFU1c0VDY2FSVDlFV1Rial81M0QxZVBDYzFDaWlLaW42SFp4OEFwQUFBLiIsInN1YiI6ImIyZGVhNDc1LWU4OWEtNGI2NC04YzkyLTIxODgwYzk4OGYxNiIsInRpZCI6IjM5N2VkMDMxLTM5MzUtNDBiMC05YzY5LTE0ZmQxMTY0ZGI4ZiIsInV0aSI6IjNRQ1hJZGhMTVVLUnh3NkxwbndoQUEiLCJ2ZXIiOiIxLjAifQ.SU9kpXWs6fP-9T8QlPOJT8rKihPdtd38B8frOiS1I36T5LjewEyTmHgTEKWKgPhGxUHkmYWQxi6itNsn_4H_XUpgvVU2oNxoYsumQIW8rQZUx7hZeqxPrY3hbl_UfJgCtZ3J_0z6Ekk6QmBA-VBFEueq5lzjlARqYgTyQQ-uaNUtyrih4HyOkSkwcC8rs20UAjguunDVAzVucjweB0B2m9ib-uT1hhJlOihOwNtZ-A28QYNihp4r8HkriMaZMqutrdrVhH_--0OpF1O7lFEGEeDQeDozWi4SjboWJcODgsOGsZ7HxHd3Lx5mv8vJ0MvC8z_GIRWpuQqJuZ7eXQeFWg

解码令牌:


  "typ": "JWT",
  "alg": "RS256",
  "x5t": "Mr5-AUibfBii7Nd1jBebaxboXW0",
  "kid": "Mr5-AUibfBii7Nd1jBebaxboXW0"
.
  "aud": "api://570f77fe-098f-42cd-8a22-a29fa1d9c7c0",
  "iss": "https://sts.windows.net/397ed031-3935-40b0-9c69-14fd1164db8f/",
  "iat": 1639708399,
  "nbf": 1639708399,
  "exp": 1639712299,
  "aio": "E2ZgYNi2cDa/xtG2feu01Q7qTr51AgA=",
  "appid": "570f77fe-098f-42cd-8a22-a29fa1d9c7c0",
  "appidacr": "1",
  "idp": "https://sts.windows.net/397ed031-3935-40b0-9c69-14fd1164db8f/",
  "oid": "b2dea475-e89a-4b64-8c92-21880c988f16",
  "rh": "0.ASkAMdB-OTU5sECcaRT9EWTbj_53D1ePCc1CiiKin6HZx8ApAAA.",
  "sub": "b2dea475-e89a-4b64-8c92-21880c988f16",
  "tid": "397ed031-3935-40b0-9c69-14fd1164db8f",
  "uti": "3QCXIdhLMUKRxw6LpnwhAA",
  "ver": "1.0"
.[Signature]

我通过这个 URL 得到这个令牌:

https://graph.microsoft.com/v1.0/

使用以下代码:

 url = new URL(urlHost);
            token = tokenCredentialAuthProvider.getAuthorizationTokenAsync(url).get();

【问题讨论】:

【参考方案1】:

解决错误InvalidAuthenticationToken 错误消息:访问令牌验证失败。无效的观众

aud (audience):这标识了令牌的预期接收者——它的观众。

您的 API 必须验证此值并在该值不匹配时拒绝令牌。

根据您提供的详细信息,您使用的是 v1.0 版

在 v1.0 令牌中,它可以是客户端 ID 或请求中使用的资源 URI,具体取决于客户端如何请求令牌

要解决此错误,您需要确保令牌中的 audiencehttps://graph.microsoft.com,使用范围:https://graph.microsoft.com/.default在您的代币获取电话中

确保您在令牌获取调用期间使用其客户端 ID 的应用程序同意以下权限。

1)User.ReadWrite.All
2)Directory.ReadWrite.All

要提供同意,您需要导航到:

1) Azure 门户 > Azure Active Directory > 应用注册 > 使用客户端 ID 搜索应用 > API 权限 > 添加权限

2) 点击添加权限

【讨论】:

我认为这与 JBOSS 和 Eclipse 有关,因为我部署了 WAR 手动将其上传到 JBOSS Web 控制台,并且部署良好!我不知道eclipse有什么问题!

以上是关于当我尝试验证用户是不是存在于 Azure Active Directory 中时,如何解决 Invalid Audience?的主要内容,如果未能解决你的问题,请参考以下文章

如何验证输入电子邮件是不是已存在于数据库中?

如何检查用户是不是存在于 Firebase 中?

Azure AD:50155 设备身份验证失败

Azure 应用服务中的 LDAP 身份验证失败

具有 Azure 应用服务身份验证的 .NET Core 应用

使用 beanshell 验证文件是不是存在于 jmeter 中的某个位置