如何从 Azure AD 获取帐户?

2024-01-07

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

我这样做:

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

这创建了我的客户端应用程序。工作正常。
我还使用“https://graph.microsoft.com/.default https://graph.microsoft.com/.default" 并可以使用它来获取 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();

我还可以创建一个 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/Directory.Read.All“ 代替 ”https://graph.windows.net/.default https://graph.windows.net/.default”。 以交互方式访问令牌后,您还可以使用 client.AcquireTokenSilent() 获取更多令牌。从这里开始就有点棘手了,特别是如果你想访问很多不同的项目。幸运的是,Active Directory 主要是目录本身、组、用户和成员。 就我个人而言,我更喜欢从 Azure 网站授予访问权限,但这非常有趣。 无论如何,我想使用 Azure 对用户进行身份验证现在我知道该怎么做了。它还留下了很多问题,但这一切基本上都回答了我的问题...... 我将用它作为答案,因为其他人可能会发现它有用......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Azure AD 获取帐户? 的相关文章

随机推荐

  • 致命:无法创建“/.git/index.lock”:文件存在

    当我尝试重命名我的任何图像名称时Xcode Project它给出以下错误 fatal Unable to create git index lock File exists If no other git process is curren
  • 使用nodejs和ffmpeg进行实时视频转换

    我正在尝试使用 ffmpeg 和 nodejs 创建非常简单的服务器端视频转换 到目前为止 我有 2 台 UDP 服务器 一台用于转换视频输入 第二台用于监听转换后的视频并将其传递到 websocket 我创建了一个 UDP 服务器 其中有
  • Promise.all 和 Promise.race 是否有记录的行为有效地使所有承诺“得到处理”?

    下面 代码unhandledRejection没有被解雇p2 即使它也被拒绝 尽管晚于p1 process on unhandledRejection reason promise gt console log unhandledRejec
  • 无法从 OpenShift origin pod 解析 github.com

    我有一个基本的 OpenShift 起源集群oc cluster up 现在 在默认的 MyProject 中 我想从 git repo 构建源 但失败并出现错误Could not resolve host github com Name
  • 核心数据迁移技术:移动属性 -> 建模关系

    我有一个相当大的基于核心数据的数据库模式 约 20 个实体 超过 140 个属性 当它从 1 x 代码库迁移到 2 x 代码库时 它正在经历巨大的变化 我非常熟悉执行轻量级迁移 但我对这种特定的迁移有点困惑 因为有一些实体用于将相关对象存储
  • 用于计算子组中的排名和中位数的 SQL 排名查询

    我想计算Median http en wikipedia org wiki Median of y in 子组这个简单的xy table x y groups gt gid x y medians gt gid x y 0 1 4 0 0
  • PHP 只读属性?

    在使用 PHP 的 DOM 类 DOMNode DOMEElement 等 时 我注意到它们拥有真正的只读属性 例如 我可以读取 DOMNode 的 nodeName 属性 但无法写入它 如果我这样做 PHP 会引发致命错误 如何在 PHP
  • 如何用vite做多个捆绑?

    使用vite js捆绑我的库 我需要同时提供两个版本 生产用途 通过 devtools 集成开发特定代码和警告 当我使用 webpack 时 我有 module exports defaultUmdBuild production defa
  • 在AJAX上初始化Google地图刷新部分

    我可以毫无问题地显示带有标记的谷歌地图 但是当使用ajax刷新该部分时 我无法在该部分中显示地图 我猜这是因为使用 ajax 时不会触发最后的最终初始化行 function initialize var myLatlng new googl
  • Dynamics 365 Web API 电子邮件发送

    我正在为网站上的页面建立订阅 因此 潜在订阅者通过表单发布并添加到 Dynamics 365 Online 中的营销列表 然后 我根据网站上的预定工作向营销列表中的联系人提出请求 然后我需要向他们发送一封电子邮件 说明已使用此属性创建了一个
  • NetworkX:在 DAG 中查找最长路径,返回最大的所有关系

    我无法弄清楚如何更新 networkx dag find longest path 算法以返回 N 表示关系 而不是返回找到的第一个最大边 或返回与最大权重相关的所有边的列表 我首先从 pandas 数据帧创建了一个 DAG 其中包含如下子
  • Python 是 vs == [重复]

    这个问题在这里已经有答案了 可能的重复 Python 中的字符串比较 is 与 https stackoverflow com questions 2988017 string comparison in python is vs 什么时候
  • 使用 Remember_me 时注销后 Flask-Login 仍然登录

    要使用 Flask login 在 Flask 中注销用户 我只需调用 logout user 但是在添加一些额外的会话检查后 在我单击注销并再次单击返回 登录页面 后 我仍然登录 它发生了只有当我选择 记住我 时 我想我在这里误解了 se
  • 本地和远程重命名 Git 分支? [复制]

    这个问题在这里已经有答案了 有没有办法在本地重命名 Git 分支并将其推送到远程分支 即使已经有很多提交推送到远程分支 或者 是否需要创建一个新的本地分支 删除旧的本地分支 然后在远程仓库上重复操作 Yes 特点move存在以在本地重命名分
  • 创建树结构

    我正在开发一个 asp net 项目 在我的 aspx 页面中 我有一个 gridview 它有 3 列 元素 目标 父级 在客户端 我想使用 gridview 中的数据构建一个树结构 然后用数字构建一个树 我找到了有关如何构建图形的信息和
  • YouTube onPlayerReady 永远不会被触发

    知道为什么这个脚本不起作用吗 我想要的只是追踪onStateChanged事件 但也从未被调用过 当我使用下面的代码打开 html 文档时 我没有错误 youtube 脚本加载得很好 播放器对象不是undefined 看起来也不错 docu
  • 基于函数的索引没有提高查询性能

    我已经创建了视图 并在该视图中添加了我需要的以下 case 语句 并且我已经为其创建了基于函数的索引 该视图有1900000条记录 当我尝试执行该视图时 需要几个小时才能运行 并且该视图的性能非常低 我不明白如何提高性能 CREATE OR
  • Java 中最大字符串不匹配数

    我最近在 codehub 上遇到了一个问题 但无法解决这个查询 谁能帮我解决这个问题吗 给定一个长度为 N 的字符串 S 您可以选择并反转 S 中任意长度的任何子字符串 您可以多次执行此操作 通过执行操作确定最大不匹配数 不匹配 S 被定义
  • 阻止 & 符号变成 Windows 窗体绑定的助记符/加速器 [重复]

    这个问题在这里已经有答案了 可能的重复 在标签控件绑定到用户填充的属性的屏幕上 我在标签上看到带下划线的字符 助记符 因为基础数据包含 符号 例如 如果绑定属性包含 A B Trucking 则标签显示为 AB Trucking 且 B 带
  • 如何从 Azure AD 获取帐户?

    我有一个很好的 Azure Active Directory 设置有十几个用户 都是我 所以我有一个租户 ID 客户端 ID 和客户端密钥 我还在开发一个简单的控制台应用程序 它将充当该目录的公共客户端 该客户端还保存用户名和密码列表 因为