在令牌获取期间未找到缓存令牌



我想从部署在MicrosoftAzure Cloud Active Directory 上的ASP.NET MVC应用程序的控制器发送请求,并从仍部署在Microsoft Azure Cloud Active Directory上的服务接收响应。

为此,我下载了一个示例,您可以从此处看到并为自己自定义。我行动的详细文档包含在同一链接中。

在 Azure 门户上测试服务和 Web 应用程序时,在标头中遇到了一条错误消息:

无法以静默方式获取令牌,因为在缓存中找不到令牌。 调用方法 获取令牌

发生错误的地方是我的控制器中的以下部分:

ClientCredential credential = new ClientCredential( clientId, appKey );
result = await authContext.AcquireTokenSilentAsync( todoListResourceId, credential, new UserIdentifier( userObjectID, UserIdentifierType.UniqueId ) );

clientId:安装在 Azure AD 上的 Web 应用程序的标识符(例如:c95d45dd-ba7f-41be-a995-1db604afff32(

appKey:门户中我的 Web 应用程序的隐藏键值

todoListResourceId:在 Azure AD 上安装的 API 应用程序的标识(例如:4cfebcb4-6f2e-4eeb-84f2-4220f65774ed(

userObjectID:从以下代码段返回的值

string userObjectID = ClaimsPrincipal.Current.FindFirst( "http://schemas.microsoft.com/identity/claims/objectidentifier" ).Value;

即在浏览器中在线的用户的值。如我的 GitHub 链接上的文档中所述,此值不是我在登录 Azure 门户时使用的Microsoft帐户,而是我注册到Azure Active Directory的用户的值

之前在这里讨论并回答过与此主题类似的主题,但是这个答案并没有解决我的问题。

我已经工作了好几天,但我没有得到服务中的GETPOSTPUTDELETE方法的回复。我一直在处理标题中的错误。我在等你的帮助。

您收到此错误的原因是,当缓存为空时,调用 acquiretokensilentasync 预计会引发该错误。此调用旨在捕获尝试捕获。如果它确实抛出此错误,则应调用 acquiretokenasync 调用。

除此之外,看起来您正在尝试通过 acquiretokensilentasync 调用来利用客户端凭据流,根据 ADAL wiki 文档,这不是使用的正确方法。

请参阅此处了解如何正确执行此操作:https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Client-credential-flows

看起来您正在使用应用程序ID和机密,特别是有关如何根据上面链接的文档执行此操作的方法是:

AuthenticationContext authenticationContext = new AuthenticationContext("https://login.microsoftonline.com/<tenantId>");
AuthenticationResult result = await authenticationContext.AcquireTokenAsync("https://resourceUrl", clientCredential);

更多专门针对 acquiretokensilentasync 调用的文档可以在这里找到 https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/AcquireTokenSilentAsync-using-a-cached-token:

从上面的文档中:

获取令牌的推荐模式

现在您已经看到了AcquireTokenAsync,AcquireTokenSilentAsync,现在是正确的时机 提供调用这些方法的建议使用模式。这 想法是您希望最大程度地减少用户的签名次数, 因此,您需要:

首先尝试以静默方式获取令牌,如果此调用失败,请尝试 以交互方式获取一个。请注意,AcquireTokenSilent不需要 要在客户端凭据流中调用(当应用程序 在没有用户的情况下获取令牌,但以自己的名义(

请注意,AcquireTokenSilent 可能由于多种原因而失败,例如 缓存不包含用户的令牌,或者令牌已过期 并且无法刷新。出于这些原因,呼吁 AcquireTokenAsync通常会获得一个令牌。但也有问题 例如网络问题,STS不可用等,这些不会 可直接解决。您将在本文中更详细地看到它们 关于处理错误的最佳做法。

除此之外,看起来你正在使用 ADAL 库,我建议迁移到 MSAL 库,因为Microsoft正在慢慢转向使用 MSAL 库,并且将在将来的某个时候(也许是遥远的将来(离开 ADAL/V1.0 终结点。然而,目前还没有硬性日期。有关从 ADAL 迁移到 MSAL 的文档可在此处找到:

https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Adal-to-Msal

最新更新