【问题标题】:No cache tokens were found during token acquisition令牌获取期间未找​​到缓存令牌
【发布时间】:2020-02-04 07:50:56
【问题描述】:

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

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

当我在我的 Azure 门户上测试服务和 Web 应用程序时,我在标题中遇到了错误消息:

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

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

            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 中注册的用户的值

之前已经讨论过和这个话题类似的话题here回答了,但是这个回答并没有解决我的问题。

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

【问题讨论】:

  • 显示您的整个程序。您遇到了身份验证问题。
  • 整个项目位于问题中的 GitHub 链接上。
  • 问题必须是独立的。外部链接中断、被删除等。阅读此链接并更新您的问题。 stackoverflow.com/help/minimal-reproducible-example
  • 链接上的账号是我自己的账号。这就是我要分享的代码。没有什么了。我已经尝试解决这个问题好几天了,但我的时间不多了。
  • @JohnHanley 我需要分享整个程序吗?当我调用 AcquireTokenSilentAsync 方法时,我得到了那个错误。这就是问题所在。其他任何地方都没有。我还提到了我在方法中获得参数的位置。你说这是身份验证问题。我把方法叫错了吗?我需要在门户端进行配置吗?这就是我想知道的全部。

标签: asp.net-mvc azure asp.net-web-api azure-active-directory azure-cloud-services


【解决方案1】:

您收到此错误的原因是因为调用 acquiretokensilentasync 预计会在缓存为空时引发该错误。这个调用是为了在 try catch 中被捕获。如果它确实抛出了这个错误,它应该调用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

【讨论】:

  • 我按照您想要的方式更改了控制器并提交了它。您可以在 GitHub 链接中看到更改。 (TodoListWebApp/Controllers/TodoListController.cs)。这是我以前尝试过的一种方法。当我像这样使用它时,当我向服务发送请求时响应变为假(response.IsSuccessStatusCode = false)。所以我还是没有从Web API的get方法中得到答案。
  • 我认为 TodoListService/Controllers/TodoListController.cs 中的 ClaimsPrincipal 部分是服务返回错误结果的原因。
  • 结果为假,因为服务中的 ClaimsPrincipal.Current.FindFirst("schemas.microsoft.com/identity/claims/scope") 为空。(TodoListService/Controllers/TodoListController.cs)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 2016-05-17
相关资源
最近更新 更多