C# 如何从Azure AD获取帐户?

C# 如何从Azure AD获取帐户?,c#,azure-active-directory,console-application,.net-4.7.2,C#,Azure Active Directory,Console Application,.net 4.7.2,我有一个很好的Azure Active Directory,有十几个用户。(全是我!)所以我有租户ID、客户ID和客户机密。 我还正在开发一个简单的控制台应用程序,它将作为这个目录的公共客户端。这个客户端还保存一个用户名和密码列表,因为这只是一个简单的实验。不安全,我知道。但我首先需要了解它是如何工作的 我这样做: IConfidentialClientApplication client = ConfidentialClientApplicationBuilder

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

我这样做:

IConfidentialClientApplication client = ConfidentialClientApplicationBuilder
                                  .CreateWithApplicationOptions(options).Build();
这就创建了我的客户端应用程序。工作正常。
我还可以使用“”获取令牌,并可以使用它将所有用户作为JSON获取:

string result = await GetHttpContentWithToken("https://graph.microsoft.com/v1.0/users", 
                                               token.AccessToken);
虽然我可能希望它更加用户友好,但JSON目前还可以

如何检查用户是否为授权用户?
不,我不希望复杂的解决方案需要各种nuget软件包。只是一个简单明了的逐步解释。我可能会用谷歌搜索这个,但我最终得到了数千条结果,没有一条是有用的。。。这应该很容易,对吧


[编辑]我首先想得到一个由于打字错误而失败的用户列表。。。(默认值前有一个点…)

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

var options = new PublicClientApplicationOptions()
{
    ClientId = <**clientid**>,
    TenantId = <**tenantid**>,
    AzureCloudInstance = AzureCloudInstance.AzurePublic,
};
var client = PublicClientApplicationBuilder.CreateWithApplicationOptions(options).Build();
但如果我想使用代码登录,我也可以使用:

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();
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)广告组和(3)广告用户。也许还有一点。。。 如果我愿意,我可以使用这个ExecCmd来检索更多的数据。但是还有一些事情需要记住!为了让一切正常工作,您还需要配置Azure应用程序,并确保所有访问权限都已分配和批准! 所以,在Azure广告中,你必须添加一个“应用程序注册”并摆弄设置。。。(Azure专家们现在非常震惊,但当你想学习时,你只能尝试失败,直到成功……) 还为注册的应用程序将“默认客户端类型”设置为“公共客户端”。 在Azure中,使用已注册的应用程序,您还需要设置正确的API权限!否则,您将无法访问。由于我想访问Active Directory,我需要向“Azure Active Directory图形”添加权限。我可以在Azure内部或通过调用AcquireTokenInteractive()时使用作用域来实现这一点。例如,使用“”而不是“”。 以交互方式访问令牌后,还可以使用client.AcquireTokenSilent()获取更多令牌。从这里开始有点棘手,特别是如果你想访问很多不同的项目。幸运的是,Active Directory主要是目录本身、组、用户和成员。 就个人而言,我更喜欢从Azure网站授予访问权限,但这很有趣。 无论如何,我想用Azure对用户进行身份验证,现在我知道怎么做了。还有很多问题,但这些基本上回答了我的问题。。。
我将使用此作为答案,因为其他人可能会发现它很有用…

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