温馨提示:本文翻译自stackoverflow.com,查看原文请点击:asp.net mvc - No cache tokens were found during token acquisition
asp.net-mvc asp.net-web-api azure azure-active-directory azure-cloud-services

asp.net mvc - 令牌获取期间未找​​到缓存令牌

发布于 2020-04-10 11:40:12

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

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

当我在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的用户的值

类似的话题,这个话题已经被讨论,并回答了在此之前,但这个答案并没有解决我的问题。

我已经工作了几天,但尚未从服务中的GETPOSTPUTDELETE方法得到响应我一直在处理标题中的错误。我在等你的帮助。

查看更多

提问者
Gbsibascin
被浏览
92
Frank Hu MSFT 2020-02-04 07:50

之所以收到此错误,是因为在高速缓存为空时,调用acquiretokensilentasync会引发该错误。该调用应被尝试捕获。如果确实抛出此错误,则应调用acquisitiontokenasync调用。

除此之外,您似乎正在尝试通过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