Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DefaultAzureCredential().GetTokenAsync在Azure中运行时使用自定义作用域时失败_C#_.net_Azure_Authentication_Azure Active Directory - Fatal编程技术网

C# DefaultAzureCredential().GetTokenAsync在Azure中运行时使用自定义作用域时失败

C# DefaultAzureCredential().GetTokenAsync在Azure中运行时使用自定义作用域时失败,c#,.net,azure,authentication,azure-active-directory,C#,.net,Azure,Authentication,Azure Active Directory,我正在尝试在Azure AD中使用服务到服务的身份验证。当这两个服务(webapps)针对Azure AD应用注册在本地运行时,我就可以使用它了。但是当webapps在Azure中运行时(针对相同的Azure广告应用注册),它就不起作用了 我已经创建了两个Azure应用程序服务webapps(它们是ASP.NET核心Web API项目)——一个作为客户端,另一个作为服务器。断开的是客户端webapp,它从AzureAD请求访问令牌。它仅在请求具有自定义作用域的令牌时中断。不过,在本地webapp

我正在尝试在Azure AD中使用服务到服务的身份验证。当这两个服务(webapps)针对Azure AD应用注册在本地运行时,我就可以使用它了。但是当webapps在Azure中运行时(针对相同的Azure广告应用注册),它就不起作用了

我已经创建了两个Azure应用程序服务webapps(它们是ASP.NET核心Web API项目)——一个作为客户端,另一个作为服务器。断开的是客户端webapp,它从AzureAD请求访问令牌。它仅在请求具有自定义作用域的令牌时中断。不过,在本地webapp中,同样的“自定义范围”令牌请求可以正常工作

在Azure中,我创建了一个“应用程序注册”,并给它一个名为“bob”的自定义范围

在客户端ASP.NET Core webapi应用程序中,我添加了
Azure.Identity
nuget包,我得到了这样一个令牌

var-tokenRequestContext=new-tokenRequestContext(new[]{scope});
token=Wait new DefaultAzureCredential().GetTokenAsync(tokenRequestContext,cancellationToken);
(其中范围变量与上面屏幕截图中的名称匹配)

在本地,这可以正常工作并返回一个令牌

在Azure中,我遇到了以下异常:

Azure.Identity.AuthenticationFailedException: DefaultAzureCredential failed to retrieve a token from the included credentials.
- ClientSecretCredential authentication failed: AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid. The scope api://<guid>/bob is not valid.
Azure.Identity.AuthenticationFailedException:DefaultAzureCredential未能从包含的凭据中检索令牌。
-ClientSecretCredential身份验证失败:AADSTS70011:提供的请求必须包含“范围”输入参数。为输入参数“scope”提供的值无效。范围api:///bob 无效。
(我已从该代码段中删除GUID)

在本地和Azure中运行此操作时,我将
Azure\u客户端\u ID
Azure\u客户端\u SECRET
Azure\u租户\u ID
环境变量设置为相同的值。考虑到这些环境变量是相同的,我不明白为什么它在本地的工作方式与在Azure中的不同


请注意,我的意图是使用托管服务标识,而不是设置这些环境变量。但就目前而言,通过在本地和Azure中使用这些环境变量,两者都应该使用相同的“ClientSecretCredential”身份验证,因此我希望得到相同的结果。

答案有两部分:

当前仅适用于使用的本机Azure服务SDK。在您的情况下,您正试图将其用于自定义范围的自定义web应用程序身份验证,该范围未得到官方支持或记录。对于常规身份验证流(如本例中的客户端凭据授予),您应该仍在使用,或者为了更方便地与asp.net核心应用集成

注意:特别是对于客户端凭据流,它只允许.default作用域。有一个开放的解决方案和另一个解决方案。

现在来谈谈为什么它不能在Azure.Identity DefaultAzureCredential中工作的问题(不管它是否得到官方支持)。我怀疑在您部署的Web应用程序中,可能缺少一个或多个上下文(IDENTITY_ENDPOINT或AZURE_AUTHORITY_HOST可能是我在查看代码时的猜测)。但除非我们很少尝试和出错,否则就不知道了(同样,我只想出于实验目的,而不是在真正的生产应用程序中,因为缺乏官方支持)。
DefaultAzureCredential
按顺序尝试通过以下机制进行身份验证。在您的本地计算机中,它可能能够从链中的一个机制(如VS或CLI)获取所需的上下文,而在部署的应用程序中,这些机制根本不存在。

谢谢@krishnendughosh msft。这感觉就像是只针对本机Azure Services SDK—这应该是文档中提到的第一件事。这会为我和同事节省很多时间。我的本地托管webapp和Azure托管webpp都在使用图表中的“环境”框(即“ClientSecretCredential”)。我可以看到,在我粘贴到Azure端的初始帖子中的错误,然后在本地,如果我注释掉环境变量,它会返回到交互式浏览器。如果我不这样做,那么它就不能使用交互式浏览器。(1/2)查看microsoft identity web库-我想要的是,它的工作方式与调用
GetAccessTokenForAppAsync
获取令牌的方式类似。这是否具有相同的回退机制?它是否可以在Azure中使用MSI,但在本地运行时,回退到图表中的内容?我今天上午晚些时候会尝试一下,然后接受你的答案。再次感谢:)(2/2)@Dan,谢谢你的反馈。尽管在本文的第一行中已经提到“Azure标识库提供了跨Azure SDK的Azure Active Directory令牌身份验证支持。它提供了一组令牌凭据实现,可用于构建支持AAD令牌身份验证的Azure SDK客户端。”。但我肯定会把这些反馈意见,看看我们是否可以更新,以更明显的方式突出它(1/2)谢谢。这是有道理的。因此,自定义范围仅用于用户登录,不能用于服务器到服务器。您发布的链接很好地解释了如何将Approvles添加到清单中-这很好。再次感谢您在这方面的帮助。不过没关系——我们实际上不需要使用作用域——只是想弄清楚它是如何工作的,以及为什么作用域不起作用。我现在只使用应用程序角色,这非常有效:)