首页 > 解决方案 > 设置安全性后使用 C# 访问弹性搜索

问题描述

我按照此链接设置安全性。这意味着我现在必须在访问时输入用户名和密码:

http://localhost:9200/

让我们说用户名是 un 和pwis pw234。我现在如何在我的 C# 代码中使用它。我试过:

public static ElasticClient GetClient(string indexName)
{
    var node = new Uri(ConfigurationManager.AppSettings["Search-Uri"]);
    var settings = new ConnectionSettings(node)
      .DefaultIndex(indexName);
      settings.ThrowExceptions(alwaysThrow: true); // I like exceptions
      settings.PrettyJson(); // Good for DEBUG
      settings.RequestTimeout(TimeSpan.FromSeconds(300));
      settings.BasicAuthentication("un", "pw234");
    return new ElasticClient(settings);
}

我必须使用 BasicAuthentication 吗?请注意,这绝不是生产代码。我永远不会像这样硬编码用户名和密码。谢谢。

标签: c#elasticsearchnest

解决方案


基本身份验证是内置用户帐户(本机领域)可以用来进行身份验证的一种身份验证方案。支持其他基于令牌的身份验证服务:

  1. 使用Bearer(身份验证方案)令牌的令牌服务,基于 OAuth2 规范
  2. ApiKey使用(身份验证方案)令牌的 API 密钥

通常,对于与 Elasticsearch 交互的应用程序(即非用户),您可能会使用这些基于令牌的身份验证服务之一。客户端公开配置 API 密钥以进行身份​​验证ConnectionSettings

public static ElasticClient GetClient(string indexName)
{
    var node = new Uri(ConfigurationManager.AppSettings["Search-Uri"]);
    var settings = new ConnectionSettings(node)
      .DefaultIndex(indexName)
      .ThrowExceptions(alwaysThrow: true) // I like exceptions
      .PrettyJson() // Good for DEBUG
      .RequestTimeout(TimeSpan.FromSeconds(300))
      .ApiKeyAuthentication("<id>", "<api key>");

    return new ElasticClient(settings);
}

承载令牌也可以与客户端一起使用,但是没有像基本身份验证和 api 密钥身份验证那样公开设置标头的专用方法,因此.GlobalHeaders()需要使用ConnectionSettings基于每个请求(通过)的方法。.RequestConfiguration()

除了原生领域,Elasticsearch 还支持以下领域

  1. LDAP 用户认证
  2. Active Directory 用户身份验证
  3. PKI(客户端证书)用户认证
  4. 基于文件的用户认证
  5. SAML 身份验证:旨在与 Kibana 一起用于 SSO
  6. Kerberos 身份验证
  7. OpenID 连接身份验证

推荐阅读