我想从部署在Microsoft Azure Cloud Active Directory上的ASP.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的用户的值
类似的话题,这个话题已经被讨论,并回答了在此之前,但这个答案并没有解决我的问题。
我已经工作了几天,但尚未从服务中的GET,POST,PUT,DELETE方法得到响应。我一直在处理标题中的错误。我在等你的帮助。
之所以收到此错误,是因为在高速缓存为空时,调用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
我按照您想要的方式更改了控制器并提交了它。您可以在GitHub链接中看到更改。(TodoListWebApp / Controllers / TodoListController.cs)。这是我以前尝试过的方法。当我像这样使用它时,当我向服务发送请求时,响应变为false(response.IsSuccessStatusCode = false)。因此,我仍然没有从Web API的get方法获得答案。
我认为TodoListService / Controllers / TodoListController.cs中的ClaimsPrincipal部分是该服务返回错误结果的原因。
结果为假,因为在服务中ClaimsPrincipal.Current.FindFirst(“ schemas.microsoft.com/identity/claims/scope”)为空。(TodoListService / Controllers / TodoListController.cs)