我有一个 Web 应用程序在托管身份上下文中的 Azure 中运行。此托管标识已成为 Azure DevOps 项目的所有者。我正在尝试连接到 Azure DevOps API 并检索版本列表。使用 PAT 代币时,一切顺利。当这个东西部署到 WebApp 时,我收到了相关错误。 托管身份似乎已在 WebApp 上正确配置,因为它连接到各种 Azure 资源,没有任何问题。
我错过了什么?这是一个绿地项目,所以一切都是最新的。使用 Microsoft.VisualStudio.Services.* v19.225.1 nuget 包
public class VssCredentialProvider : IVssCredentialProvider
{
private readonly IRuntimeEnvironmentQuery _runtime;
private readonly IAppLogger _logger;
private const string AdoAppClientId = "499b84ac-1321-427f-aa17-267ca6975798/.default";
public VssCredentialProvider(IRuntimeEnvironmentQuery runtime, IAppLogger logger)
{
_runtime = runtime;
_logger = logger;
}
public async Task<VssCredentials> GetVssCredentials()
{
if (_runtime.IsDevelopment)
{
var vsoId = System.Environment.GetEnvironmentVariable("VSO_ID")!;
var vsoToken = System.Environment.GetEnvironmentVariable("VSO_PAT")!;
return new VssCredentials(new VssBasicCredential(vsoId, vsoToken));
}
var tokenObject = await new DefaultAzureCredential()
.GetTokenAsync(new TokenRequestContext(scopes: new[] { $"{AdoAppClientId}/.default" }));
await _logger.LogAsync($"Retrieved ADO API token expiring on {tokenObject.ExpiresOn}");
return new VssCredentials(new VssOAuthAccessTokenCredential(tokenObject.Token));
}
}
尝试使用
GetTokenAsync(new TokenRequestContext(new[] { "499b84ac-1321-427f-aa17-267ca6975798/.default" }), CancellationToken.None);
正如 mbd 所提到的,范围是脚本中的 499b84ac-1321-427f-aa17-267ca6975798/.default/.default
。
您也可以参考这个示例代码。