通过代码

时间:2017-10-03 09:23:31

标签: c# azure azure-active-directory

作为合作伙伴,我登录合作伙伴中心,选择具有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'应该存在。如果您正在访问   作为应用程序,请确保正确创建服务主体   在租客中。

任何?

1 个答案:

答案 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}