You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure托管身份访问Azure DevOps API出现VS30063授权失败问题

解决Azure托管身份访问Azure DevOps API未授权问题

问题描述

我在Azure中运行一个基于托管身份的Web应用,该托管身份已被设置为Azure DevOps项目的所有者。尝试连接Azure DevOps API获取发布列表时,使用PAT令牌可正常运行,但部署到WebApp后出现错误:VssUnauthorizedException: VS30063: You are not authorized to access https://xxxx.visualstudio.com。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));
    }
}

核心问题与修复步骤

1. 修正OAuth Scope配置

代码中使用的Scope是错误的。访问Azure DevOps API时,必须使用与你的组织域名匹配的Scope,而非固定的服务主体ID:

  • 若使用dev.azure.com域名:https://dev.azure.com/{你的组织名}/.default
  • 若使用旧版visualstudio.com域名:https://xxxx.visualstudio.com/.default(替换xxxx为你的组织前缀)

修改后的代码片段:

// 替换为你的组织对应的Scope
var tokenObject = await new DefaultAzureCredential()
    .GetTokenAsync(new TokenRequestContext(scopes: new[] { "https://dev.azure.com/你的组织名/.default" }));

2. 确认Azure DevOps与Azure AD的集成及权限映射

即使已将托管身份设为项目所有者,仍需验证:

  • Azure DevOps组织已启用Azure Active Directory集成(路径:组织设置 → Azure Active Directory)
  • 托管身份对应的Azure AD服务主体已被添加到Azure DevOps的组织/项目权限列表中,且权限已生效(路径:项目设置 → 权限 → 用户,搜索服务主体名称或客户端ID)

3. 用户分配托管身份需指定ClientId

如果WebApp使用的是用户分配的托管身份,创建DefaultAzureCredential时必须指定其客户端ID,否则无法正确获取身份令牌:

var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = "你的用户分配托管身份客户端ID"
});
var tokenObject = await credential.GetTokenAsync(new TokenRequestContext(scopes: new[] { "正确的Scope" }));

4. 调试验证令牌有效性(可选)

可临时添加令牌解码逻辑(仅用于调试),确认令牌包含正确的ADO组织权限。生产环境禁止输出完整令牌内容。


内容的提问来源于stack exchange,提问作者Igorek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:17:10