当我尝试验证用户是不是存在于 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,具体取决于客户端如何请求令牌
要解决此错误,您需要确保令牌中的 audience 是 https://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?的主要内容,如果未能解决你的问题,请参考以下文章