【问题标题】:How do I get accounts from Azure AD?如何从 Azure AD 获取帐户?
【发布时间】:2019-06-04 13:13:19
【问题描述】:

我有一个不错的 Azure Active Directory 设置,有十几个用户。 (全是我!)所以我有一个租户 ID、客户端 ID 和客户端密码。
我还在开发一个简单的控制台应用程序,它将作为该目录的公共客户端。该客户端还包含用户名和密码列表,因为这只是一个简单的实验。不安全,我知道。 但我首先需要了解它是如何工作的...

我这样做:

IConfidentialClientApplication client = ConfidentialClientApplicationBuilder
                                  .CreateWithApplicationOptions(options).Build();

这将创建我的客户端应用程序。工作正常。
我还使用“https://graph.microsoft.com/.default”获得了一个令牌,并且可以使用它来获取所有用户为 JSON:

string result = await GetHttpContentWithToken("https://graph.microsoft.com/v1.0/users", 
                                               token.AccessToken);

虽然我可能希望它对用户更友好,但 JSON 目前还不错。

如何检查用户是否是授权用户?
不,我不想要需要各种 nuget 包的复杂解决方案。只是一个简单明了的分步说明。我可能可以用 Google 搜索,但我最终得到了数千个结果,但没有一个有用...这应该很容易,对吧?

[编辑] 我首先想获取由于拼写错误而失败的用户列表...(“默认”之前有一个点...)

【问题讨论】:

  • 您需要使用该应用对象获取访问令牌。对于您需要使用 https://graph.microsoft.com/.default 的范围,您需要在 Azure AD 中要求应用程序权限才能通过 MS Graph API 读取所有用户。 (在 Azure 门户中找到您的应用注册以执行此操作)然后您可以使用附加到请求的令牌调用 Microsoft Graph API 的 /v1.0/users 端点。这为您提供了所有用户。
  • 要对用户进行身份验证,您需要使用可用的身份验证流程之一。您应该使用哪种流程取决于应用程序的类型。不,您不需要用户的密码。他们不应该把密码告诉你。
  • 好吧,我设法获得了一个访问令牌...但是现在是身份验证部分...

标签: c# azure-active-directory console-application .net-4.7.2


【解决方案1】:

这花了一些时间,但毕竟不是太难。 Azure 周围有很多库,但基本上都是一堆 HTTP 请求和响应。即使在控制台应用程序中... 我首先制作了一个 PublicClientApplicationBuilder:

var options = new PublicClientApplicationOptions()
{
    ClientId = <**clientid**>,
    TenantId = <**tenantid**>,
    AzureCloudInstance = AzureCloudInstance.AzurePublic,
};
var client = PublicClientApplicationBuilder.CreateWithApplicationOptions(options).Build();

我也可以创建一个 ConfidentialClientApplication 代替,但这允许我在需要时以交互方式登录。

接下来,设置范围:

var scopes = new List<string>() { "https://graph.microsoft.com/.default" };

因为我想使用用户名和密码登录,所以我必须使用这个:

var token = await client.AcquireTokenInteractive(scopes).ExecuteAsync();

但是如果我想使用代码登录,我也可以使用这个:

var password = new SecureString();
foreach (var c in <**password**>) { password.AppendChar(c); }
var token = await client.AcquireTokenByUsernamePassword(scopes, <**account**>, password).ExecuteAsync();

此时,我被授权为指定用户。所以,现在我只需要获取我喜欢的任何数据,在 JSON 字符串中......

public static async Task<string> ExecCmd(string name, string url, string token)
{
    HttpClient httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
    string result = await GetHttpContentWithToken(url, token);
    JObject json = JsonConvert.DeserializeObject(result) as JObject;
    File.WriteAllText(name, json.ToString());
    return result;
}

因为我只想将数据作为文本文件读取,所以我只需使用特定的执行操作并将其作为格式化的 JSON 写入文件。所以,使用这个简单的方法,我现在可以使用它:

await ExecCmd("Profile.txt", "https://graph.microsoft.com/v1.0/me/", token.AccessToken);
await ExecCmd("Groups.txt", "https://graph.microsoft.com/v1.0/groups", token.AccessToken);
await ExecCmd("Users.txt", "https://graph.microsoft.com/v1.0/users", token.AccessToken);

这些将为我提供 (1) 当前用户的个人资料、(2) AD 组和 (3) AD 用户。可能还有更多…… 如果我愿意,我可以使用这个 ExecCmd 来检索更多数据。但还有一点要记住!为了使这一切正常工作,您还需要配置 Azure 应用程序并确保分配和批准所有访问权限! 因此,在 Azure AD 中,您必须添加“应用程序注册”并摆弄设置......(Azure 专家现在非常震惊,但是当您想学习时,您只能尝试失败,直到您成功...) 还将注册应用的“默认客户端类型”设置为“公共客户端”。 在 Azure 中,使用注册的应用程序,您还需要设置适当的 API 权限!否则,您将无权访问。因为我想访问 Active Directory,所以我需要向“Azure Active Directory Graph”添加权限。我可以在 Azure 中执行此操作,也可以在调用 AcquireTokenInteractive() 时使用范围。例如,使用“https://graph.windows.net/Directory.Read.All”代替“https://graph.windows.net/.default”。 以交互方式访问令牌后,您还可以使用 client.AcquireTokenSilent() 获取更多令牌。从这里开始有点棘手,特别是如果你想访问很多不同的项目。幸运的是,Active Directory 主要是目录本身、组、用户和成员。 就个人而言,我更喜欢从 Azure 网站授予访问权限,但这很有趣。 无论如何,我想使用 Azure 对用户进行身份验证,现在我知道该怎么做了。它仍然留下了更多的问题,但这一切基本上都回答了我的问题...... 我会用这个作为答案,因为其他人可能会觉得它很有用......

【讨论】:

  • 我厌倦了上面提到的代码,但它继续旋转没有结果?
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 2019-02-08
  • 1970-01-01
相关资源
最近更新 更多