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

问题描述 投票:1回答:1

我想从Microsoft.Azure云活动目录上部署的ASP.NET MVC应用程序的控制器发送请求,并接收来自仍在运行的服务的响应部署在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尚未解决我的问题。

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

asp.net-mvc azure asp.net-web-api azure-active-directory azure-cloud-services
1个回答
0
投票

您收到此错误的原因是因为呼叫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

© www.soinside.com 2019 - 2024. All rights reserved.