我正在开发一个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 权限: 在此输入图片描述 在此输入图片描述 我尝试给予管理员同意,但仍然面临同样的问题。 在此输入图片描述 在此输入图片描述
您可以使用此 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 脚本在我的环境中重现相同的结果,并得到如下结果:
我有一个功能应用程序,我在其中添加了如下所示的托管身份:
转到函数应用程序中的 kudo 控制台,现在通过在函数应用程序中选择高级工具来打开 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
当我运行 $accessToken 时,我成功获得了令牌,如下所示:
参考:
解决方案是添加 Visual Studio 客户端 ID,以便为该 SPN 授权客户端应用程序,请参阅此处的答案 https://stackoverflow.com/a/79342848/1573728