如何从Azure AD获取帐户?

时间:2019-06-04 13:13:19

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

我有一个不错的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查到,但最终却得到了数千个结果,但是没有一个有用的...这应该很容易,对吧?

[EDIT]我首先想获得由于错字而失败的用户列表……(“默认”之前有一个小点...)

1 个答案:

答案 0 :(得分:0)

有些鬼混,但毕竟并不难。 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图”添加权限。我可以在Azure内执行此操作,也可以在调用AcquireTokenInteractive()时使用范围进行此操作。例如,通过使用“ https://graph.windows.net/Directory.Read.All”而不是“ https://graph.windows.net/.default”。 交互式访问令牌后,还可以使用client.AcquireTokenSilent()获得更多令牌。从这里开始有点棘手,特别是如果您想访问许多不同的项目。幸运的是,Active Directory主要是目录本身,组,用户和成员。 就个人而言,我更喜欢从Azure网站授予访问权限,但这很有趣。 无论如何,我想使用Azure验证用户,现在我知道该怎么做了。仍然有很多问题,但这基本上回答了我的问题。 我将用它作为答案,因为其他人可能会发现它有用...

相关问题