如何从 Azure AD 获取帐户?

How do I get accounts from Azure AD?

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

我这样做:

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 这个但我最终得到了数千个结果并且 none 很有帮助......这应该很容易,对吧?

[编辑] 我首先想获取因错字而失败的用户列表...('default' 之前有一个点...)

花了一些时间,但毕竟不是太难。 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 中,你必须在设置周围添加一个 "App registration" 和 fiddle...(Azure 专家现在非常震惊,但是当你想学习时,你只需要尝试失败直到你成功......) 同时将已注册应用的 "Default client type" 设置为 "public client"。 在 Azure 中,使用注册的应用程序,您还需要设置适当的 API 权限!否则,您将无法访问。因为我想要访问 Active Directory,所以我需要添加对 "Azure Active Directory Graph" 的权限。我可以在 Azure 中执行此操作,也可以在调用 AcquireTokenInteractive() 时使用范围来执行此操作。例如,通过使用“https://graph.windows.net/Directory.Read.All" instead of "https://graph.windows.net/.default”。 以交互方式访问令牌后,您还可以使用 client.AcquireTokenSilent() 获取更多令牌。从这里开始有点棘手,特别是如果您想访问很多不同的项目。幸运的是,Active Directory 主要是目录本身、组、用户和成员。 就个人而言,我更喜欢从 Azure 网站授予访问权限,但这很有趣。 无论如何,我想使用 Azure 对用户进行身份验证,现在我知道该怎么做了。它仍然留下了更多的问题,但这基本上回答了我的问题...... 我会用这个作为答案,因为其他人可能会发现它有用...