在Azure中运行时使用自定义范围时,DefaultAzureCredential()。GetTokenAsync失败

时间:2020-09-07 18:48:16

标签: c# .net azure authentication azure-active-directory

我正在尝试在Azure AD中进行服务到服务的身份验证。当两个服务(Web应用程序)针对Azure AD应用程序注册在本地运行时,我可以使用它。但是,当Web应用程序在Azure中运行时(针对相同的Azure AD应用程序注册),将无法正常工作。

我已经创建了两个Azure App Service Web应用程序(它们是ASP.NET Core Web API项目)-一个充当客户端,另一个充当服务器。中断的是客户端Webapp,它在其中向AzureAD请求访问令牌。仅当请求具有自定义范围的令牌时,它才会中断。不过,相同的“自定义范围”令牌请求在本地Web应用程序中也可以正常工作。

在Azure中,我创建了一个“应用程序注册”,并为其指定了一个自定义范围“ bob” ...

enter image description here

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

var tokenRequestContext = new TokenRequestContext(new[] {scope});

token = await 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.

(我已从该代码段中删除了GUID)

在本地和Azure中运行此命令时,我将AZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_TENANT_ID环境变量设置为相同的值。考虑到这些环境变量相同,我不明白为什么它在本地与Azure中的工作方式不同。

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

1 个答案:

答案 0 :(得分:2)

答案分为两部分:

Azure.Identity当前仅适用于使用new Azure.* client libraries的本机Azure Services SDK。对于您而言,您正尝试将其用于自定义范围不受官方支持或未记录的自定义Web应用程序身份验证。对于常规的身份验证流程(例如,在这种情况下,例如“客户端凭据授予”),您应该仍然使用MSAL,或者为了更轻松地与asp.net核心应用程序Microsoft Identity Web集成。

注意:专门针对客户端凭据流,它仅允许 .default 范围。有一个开放的UserVoice和另一个thread供解决。

现在要解决为什么它在Azure.Identity DefaultAzureCredential中不起作用的问题(无论它是否不受官方支持)。我怀疑在您部署的Web应用程序中,可能缺少一个或多个上下文(IDENTITY_ENDPOINT或AZURE_AUTHORITY_HOST将是我对代码的疯狂猜测)。但是除非我们做些反复试验就不知道(再说一次,我只想出于实验目的而这样做,由于缺乏官方支持,所以我不想在实际的生产应用程序中这样做)。 DefaultAzureCredential 尝试通过以下机制进行身份验证。在您的本地计算机上,它可能能够从链中的一种机制(如VS或CLI)中获取所需的上下文,而在已部署的应用程序中,这些根本不存在。