Azure DevOps Rest API 创建个人访问令牌(PAT)-- patTokenError: userIdRequired

9 浏览
0 Comments

Azure DevOps Rest API 创建个人访问令牌(PAT)-- patTokenError: userIdRequired

使用GET动词时,我能够列出现有的PAT。

使用POST动词创建PAT时,我会收到一个200 OK的响应。

负载显示:

{"patToken":null,"patTokenError":"userIdRequired"}

这个错误在文档中有列出,但没有解释如何解决它。

var clientBearer = new RestClient(@"https://login.microsoftonline.com");
var requestBearer = new RestRequest($"{tenantID}/oauth2/v2.0/token");
requestBearer.AddHeader("Content-Type", "application/x-www-form-urlencoded");
requestBearer.AddParameter("client_id", appRegistration.appId);
requestBearer.AddParameter("client_secret", appRegistrationSecret);
requestBearer.AddParameter("scope", "499b84ac-1321-427f-aa17-267ca6975798/.default");
requestBearer.AddParameter("username", username);
requestBearer.AddParameter("password", password);
requestBearer.AddParameter("grant_type", "password");
var responseBearer = clientBearer.ExecutePostAsync(requestBearer).Result;
var azureBearerToken = JsonConvert.DeserializeObject(responseBearer.Content);
var devopsBearerToken = azureBearerToken.token_type + " " + azureBearerToken.access_token;

选择密码身份验证作为唯一可行的非互动身份验证方法。此用户正在替换ServicePrincipal/ManagedIdentity,因为Microsoft不支持这些模型用于Devops REST API,并且Azure CLI中不提供所有Devops REST API功能。

https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/authentication-guidance?view=azure-devops&viewFallbackFrom=azure-devops%2F%2F

现在我有一个有效的Bearer令牌。

var devopsClient = new RestClient(@"https://vssps.dev.azure.com");
var patRequest = new RestRequest($"{devopsOrganization}/_apis/tokens/pats?api-version=7.1-preview.1");
patRequest.AddHeader("Authorization", devopsBearerToken);
patRequest.AddHeader("Content-Type", "application/json");
var patListResponse = devopsClient.ExecuteGetAsync(patRequest).Result;

这个响应看起来很好,我知道Bearer令牌起作用了。由于这是通过Azure CLI创建的新的AD用户,我期望在响应中收到一个空的PAT数组,而我确实收到了。

到目前为止,一切顺利。

//创建一个令牌
var body = new
{
    displayName = "targetName",
    scope = "app_token",
    validTo = validTo,
    allOrgs = true
};
patRequest.AddJsonBody(body);
var patCreateResponse = devopsClient.ExecutePostAsync(patRequest).Result;

这个最终的响应是问题所在,它包含了

patTokenError : userIdRequired

0
0 Comments

问题原因:UserIdRequired错误表明访问令牌中未提供UserId或用户未被允许。根据FAQ中的解释,可能是由于组织管理员在"https://dev.azure.com/{your-org-name}/_settings/organizationPolicy"上禁用了通过OAuth的第三方应用程序访问,或者在创建PAT时未在请求体中包含UserId。

解决方法:

1. 验证组织管理员是否禁用了通过OAuth的第三方应用程序访问,可通过访问"https://dev.azure.com/{your-org-name}/_settings/organizationPolicy"进行确认。

2. 尝试在创建PAT时在请求体中包含UserId,类似于"SO ref"中的示例。

3. 确保在Azure AD注册中为应用程序提供了正确的作用域(scope),以访问REST API并获得授权。用户可以通过访问用户的Azure AD租户并具有活动的Azure订阅来获取访问令牌,但如果缺乏访问Azure DevOps所需的适当权限,则用户可能无法通过REST API访问DevOps。

4. 根据Azure DevOps Services的Token Lifecycle Management REST API,令牌的作用域应为"499b84ac-1321-427f-aa17-267ca6975798/.default",该作用域提供对Azure DevOps Services REST API的访问。确保正确提供了作用域,并确保已授予管理员同意。

5. 对于其他PAT Token错误的情况,建议撤销该PAT。

0