作为合作伙伴,我登录合作伙伴中心,选择具有Azure订阅的客户并通过“服务管理”> “Microsoft Azure管理门户”链接和我登陆选定的客户环境。从那里我可以分配新的用户和角色(即:订阅的所有者)。
但我无法使用Azure Management API自动执行此操作。我发现了类似的问题here并尝试实现令牌获取(因为提供的令牌不起作用)如下:
public string GetToken(string tenantId, string clientId, string username, string password)
{
var creds = new UserPasswordCredential(username, password);
var authContext = new AuthenticationContext("https://login.windows.net/" + tenantId);
var authResult = authContext.AcquireTokenAsync("https://management.azure.com/", clientId, creds).Result;
return authResult.AccessToken;
}
当我尝试使用客户的tenantId获取令牌时(如提供的链接中的响应)我收到错误:
AADSTS70001:找不到标识符为“[app_id]”的应用程序 目录[customer_tenant_id]
另一方面,当我使用我的(合作伙伴)tenantId时,当我尝试在指定的azure订阅中列出角色时,我确实得到一个令牌但我收到错误:
访问令牌来自错误的颁发者 'https://sts.windows.net/[partnerTenantId]/'。它必须与租户匹配 与此相关的“https://sts.windows.net/[customerId]/” 订阅。请使用权限(URL) “https://login.windows.net/[customerId]”获取令牌。
我获得了这个角色:
public void GetRoles(string subscriptionId, string token)
{
var uri = $"https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions?{ApiVersion}";
var client = new HttpClient();
var requestMessage = new HttpRequestMessage(HttpMethod.Get, uri);
requestMessage.Headers.Add("Authorization", "Bearer " + token);
var response = client.SendAsync(requestMessage).Result;
var responseString = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(responseString);
}
有人可以帮我解决这个问题吗?
修改
更进一步:我设法获得客户租户的代币(上述第一种方法)。我不得不编辑应用清单,更改选项
availableToOtherTenants
重视“真实”。
但是还有另一个障碍。现在,当我尝试使用令牌时,我得到:
收到的访问令牌无效:至少有一项索赔 'puid'或'altsecid'或'oid'应该存在。如果您正在访问 作为应用程序,请确保正确创建服务主体 在租客中。
任何?
答案 0 :(得分:1)
以下步骤适合我列出角色定义:
1.在开发者的租户上注册原生应用。
2.将Windows Azure Service Management API
授予应用新注册
3.尝试通过代码授予流程向客户的租户授予对应用程序的同意,以创建服务主体:
https://login.microsoftonline.com/{customTenant}/oauth2/authorize?response_type=code&client_id={clientId}&redirect_uri={redirectURL}&resource=https://management.azure.com/&nonce=123
4.使用代码授权流程获取令牌(我的测试环境已启用MFA,无法测试资源所有者密码凭据授权,但它不应与使用代码授予相同流量强>
string authority = "https://login.microsoftonline.com/{customTenant}";
string resrouce = "https://management.azure.com/";
string clientId = "";
string userName = "";
string password = "";
UserCredential uc = new UserCredential(userName,password);
AuthenticationContext authContext = new AuthenticationContext(authority);
var result = authContext.AcquireToken(resrouce, clientId, new Uri("http://localhost"));
accessToken = result.AccessToken;
5。调用REST以列出角色
GET: https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions?api-version=2017-05-01
authorization: bearer {accessToken}