elasticsearch - 在 NEST/Elasticsearch.net 中使用 azure 事件目录

标签 elasticsearch azure-active-directory nest

我们正在开展一个项目,在该项目中我们使用 Azure Active Directory 对用户进行身份验证。身份验证成功后,用户的浏览器会收到一个 Id 和访问 token ,然后我们使用相同的访问 token 查询其他 Microsoft 产品(Sharepoint、OneDrive 等)。
我们计划使用 Elastic Search 来满足我们的搜索需求。我们已经在我们的 ECE 部署门户和集群上设置了 SAML/OpenId 领域。因此,如果任何用户尝试访问 ECE 部署门户/Kibana,他们将被提示对 Microsoft Azure AD 进行身份验证,并且在成功身份验证后,他们将被重定向到 ECE 或 Kibana。
我们使用 C# 和 NEST dll (ElasticSearch.Net) 来创建查询并搜索 Elasticsearch 端点。我们不确定我们应该如何将 UI 端收到的访问 token 与 Elastic Search 一起使用来查询索引。我们知道,我们可以使用 native 用户凭据或 API key 来访问 Elasticsearch ,但我们希望使用相同的 azure 广告身份验证流程(SAML/OpenID)来访问 Elasticsearch 。
是否可以使用在 UI 端收到的 Azure AD 访问 token 来访问和查询 Elastic Search Clusters,或者在用户尝试访问 Elastic Search Cluster 时是否有任何其他方法可以重新对其进行身份验证?
有没有办法通过 Elasticsearch 端点对用户进行身份验证并生成可用于进一步查询 Elasticsearch 的访问 token ?

简而言之,我们想在查询数据的同时使用 Elastic Search 重新验证用户身份?

var settings = new ConnectionSettings(new Uri(mEsQuerySource.Url));
settings.BasicAuthentication("user", "plain text password");
mClient = new ElasticClient(settings);

最佳答案

感谢 Tim 通过弹性门户分享解决方案。我在这里更新相同的答案以帮助其他社区成员。
在 Elasticsearch 的当前版本中(在我撰写本文时,7.14 是最新版本)无法使用 Azure AD 访问 token 直接访问 Elasticsearch。
也就是说,您不能让您的应用程序直接向 AAD 进行身份验证,然后使用从 AAD 收到的 token 作为凭证向 Elasticsearch 进行身份验证。
Elasticsearch 中没有使用来自外部发行者的任意 token 的身份验证提供程序。
但是,您可以执行与 ECE 和 Kibana 相同的操作,并通过 Elasticsearch 执行 SAML 或 OpenID Connect 身份验证,以生成 Elasticsearch 访问和刷新 token (与 Azure AD token 分开)。
有关于如何执行 SAML 3 的文档或 OIDC 2通过自定义应用程序对 Elasticsearch 进行身份验证。
高级概述将是(我在这里假设 SAML,但 OIDC 将是类似的):
当用户访问您的应用程序时,他们将照常通过 AzureAD 进行身份验证
然后,您将使用 Elasticsearch API 对 Elasticsearch SAML 领域执行额外的身份验证,其中 Elasticsearch 作为服务提供者,AzureAD 作为身份提供者。
由于用户已经在 Azure AD 中进行了身份验证,因此第二个身份验证过程应该对用户透明 - AAD 将简单地以 Elasticsearch 作为接收者发出一个新的 SAML 断言。
这些 Elasticsearch API 将接受 SAML 断言,并返回一对可用于对 Elasticsearch 进行身份验证的 token (访问 + 刷新)
您的应用程序将保留用户 session 的访问 + 刷新 token
访问 token 将用于 authenticate访问 Elasticsearch API 时
刷新 token 将用于 generate a new access token当旧的过期(或即将过期)。
如果您的用户位于 Elasticsearch 可以查询的身份存储中(例如,支持 LDAP 搜索的某些内容),则另一种选择是使用 Elasticsearch run-as capability .
在这种情况下,您的应用程序将使用单个系统凭据(可能是 native 领域中的用户)对 Elasticsearch 进行身份验证。该用户将有权作为所有其他用户运行,这可用于代表您的最终用户执行搜索,而无需他们直接向 Elasticsearch 进行身份验证。
最后一个选择是实现自定义领域,如果您有擅长编写 Java 的工程师
引用:Use azure active directory with NEST/Elasticsearch.net - Elastic Stack / Elasticsearch - Discuss the Elastic Stack

关于elasticsearch - 在 NEST/Elasticsearch.net 中使用 azure 事件目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68723637/

相关文章:

java - Elasticsearch无节点可用异常

azure - 将所有 Azure AD 组及其所有者导出到 csv 文件

Elasticsearch 的 NEST API 在 POSTMAN 提交时相同查询成功时不返回查询结果

c# - 如何使用 C# 的 Nest Elasticsearch 编写查询?

python - 为什么我的 "access grant malformed"在 Azure AD 中?

elasticsearch - ElasticSearch映射:是否可以自动截断日期以适合其格式?

ElasticSearch:如何制作聚合管道?

elasticsearch - 结合两个Elasticsearch查询

node.js - 使用 Elastic Search Javascript API 对批量数据建立索引

angular - 如何从 Angular 获取 OneDrive API 的访问 token