通过 Azure.Identity 在 C# 中检索用于本地开发的令牌时遇到问题

问题描述 投票:0回答:2

我正在开发一个azure函数,需要通过托管身份连接到Microsoft Dataverse。在本地开发过程中,我在 Visual Studio 中添加了我的 Azure 帐户,并选择进行 Azure 函数身份验证。我正在使用以下代码来访问令牌:

var vsCred = new VisualStudioCredential();
var tok = await vsCred.GetTokenAsync(
new TokenRequestContext(new[] { "CLIENT ID of managed identity" }),default
);

但出现此错误: System.Private.CoreLib:执行函数时出现异常:ManagedIdentityTestFxn。 System.Private.CoreLib:进程“C:\ Program Files \ Microsoft Visual Studio�2 \ Professional \ Common7 \ IDE \ CommonExtensions \ Microsoft \ Asal \ TokenService \ Microsoft.Asal.TokenService.exe”失败并出现意外错误:TS003:错误,TS004:无法获取访问令牌。 'AADSTS65001:用户或管理员尚未同意使用 ID 为“具有本机 MSA 的 VS”的应用程序。发送此用户和资源的交互式授权请求。 Azure AD 权限: 在此输入图片描述 在此输入图片描述 我尝试给予管理员同意,但仍然面临同样的问题。 在此输入图片描述 在此输入图片描述

c# .net-core azure-active-directory dataverse azure-identity
2个回答
1
投票

您可以使用此 DefaultAzureCredential 来代替使用 VisualStudioCredential 来获取访问令牌,如下所示:

using Azure.Core;  
using Azure.Identity;

string userAssignedClientId = "<your managed identity client Id>";  
var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedClientId });  
var accessToken = credential.GetToken(new TokenRequestContext(new[] { "https://vault.azure.net" }));  
// To print the token, you can convert it to string  
String accessTokenString = accessToken.Token.ToString();

//You can use the credential object directly with Key Vault client.  
var client = new SecretClient(new Uri("https://myvault.vault.azure.net)",credential);

或者,您可以在函数应用程序的 kudo 控制台中运行以下 PowerShell 脚本,如下所示

$resourceURI ="https://admin.services.crm.dynamics.com"  
$client_id = "dd8770dc-cbae-43f0-a36d-e27XXXXX"  
$tokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&client_id=$client_id&api-version=2019-08-01"  
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI  
$accessToken = $tokenResponse.access_token 

我尝试使用 powershell 脚本在我的环境中重现相同的结果,并得到如下结果:

我有一个功能应用程序,我在其中添加了如下所示的托管身份:

enter image description here

转到函数应用程序中的 kudo 控制台,现在通过在函数应用程序中选择高级工具来打开 kudo 控制台:

enter image description here

现在我选择了 powershell 并运行如下脚本:

$resourceURI ="https://admin.services.crm.dynamics.com"  
$client_id = "dd8770dc-cbae-43f0-a36d-e27XXXXX"  
$tokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&client_id=$client_id&api-version=2019-08-01"  
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI  
$accessToken = $tokenResponse.access_token

enter image description here

当我运行 $accessToken 时,我成功获得了令牌,如下所示:

enter image description here

参考

在虚拟机上使用托管标识来获取访问令牌 - Azure AD - Microsoft Entra |微软学习


0
投票

解决方案是添加 Visual Studio 客户端 ID,以便为该 SPN 授权客户端应用程序,请参阅此处的答案 https://stackoverflow.com/a/79342848/1573728

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