Docs 菜单
Docs 主页
/ / /
C#/.NET
/

企业身份验证机制

在此页面上

  • Overview
  • 使用 GSSAPI/Kerberos 进行身份验证
  • additionalProperties
  • 使用 LDAP (PLAIN) 进行身份验证
  • MONGODB-OIDC
  • Azure IMDS
  • GCP IMDS
  • 自定义回调
  • API 文档

在本指南中,您可以了解如何使用仅在 MongoDB Enterprise 版中提供的身份验证机制对 MongoDB 进行身份验证。 身份验证机制是驱动程序和服务器在连接之前确认客户端身份以确保安全的过程。

您可以在最新版本的 MongoDB Enterprise Edition 中使用以下身份验证机制。

  • GSSAPI/Kerberos

  • LDAP (Plain)

  • MONGODB-OIDC

要使用其他机制进行身份验证,请参阅身份验证机制基础知识页面。 有关与MongoDB 集群建立连接的更多信息,请参阅连接指南。

您可以使用以下任一方法在连接到 MongoDB 时指定身份验证机制和凭证:

  • 连接字符串,也称为连接 URI,它是一个指示驱动程序如何连接到 MongoDB 部署以及连接时如何表现的字符串。

  • 支持的身份验证机制的工厂方法,包含在 MongoCredential类中。

通用安全服务 API (GSSAPI) 身份验证机制允许用户使用用户的主体名称对 Kerberos 服务进行身份验证。

以下示例使用以下占位符指定身份验证机制:

选择 Connection StringMongoCredential标签页,查看用于指定 GSSAPI/Kerberos 身份验证机制的相应语法:

var mongoClient = new MongoClient("mongodb://<username>:<password>@<hostname>/?authMechanism=GSSAPI");
var credential = MongoCredential.CreateGssapiCredential("<username>", "<password>");
var settings = MongoClientSettings.FromConnectionString("<connection string>");
settings.Credential = credential;
var mongoClient = new MongoClient(settings);

提示

省略密码

如果满足以下任一条件,则可以省略密码:

  • 在 Windows 上,运行应用程序的进程所有者与需要身份验证的用户相同。

  • 在 Linux 上,用户已通过kinit username@REALM.COM初始化其密钥表。

您可以使用连接字符串或MongoCredential类中的工厂方法通过身份验证机制指定其他属性。

以下示例显示如何使用 DNS 服务器检索主机的完全限定域名:

var mongoClient = new MongoClient("mongodb://<db_username>:<db_password>@<hostname>/?authMechanism=GSSAPI&authMechanismProperties=CANONICALIZE_HOSTNAME:true");
var credential = MongoCredential.CreateGssapiCredential("<db_username>", "<db_passwordpassword>");
credential = credential.WithMechanismProperty("CANONICALIZE_HOST_NAME", "true");
var settings = MongoClientSettings.FromConnectionString("<connection string>");
settings.Credential = credential;
var mongoClient = new MongoClient(settings);

以下示例展示了当用户的 Realm 与服务的 Realm 不同时如何指定该 Realm:

var mongoClient = new MongoClient("mongodb://<db_username>:<db_password>@<hostname>/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_REALM:<user's realm>");
var credential = MongoCredential.CreateGssapiCredential("<db_username>", "<db_password>");
credential = credential.WithMechanismProperty("SERVICE_REALM", "<user's realm>");
var settings = MongoClientSettings.FromConnectionString("<connection string>");
settings.Credential = credential;
var mongoClient = new MongoClient(settings);

以下示例展示了当服务名称不是默认的 mongodb 时,如何指定服务名称:

var mongoClient = new MongoClient("mongodb://<db_username>:<db_password>@<hostname>/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:<service name>");
var credential = MongoCredential.CreateGssapiCredential("<db_username>", "<db_password>");
credential = credential.WithMechanismProperty("SERVICE_NAME", "<service name>");
var settings = MongoClientSettings.FromConnectionString("<connection string>");
settings.Credential = credential;
var mongoClient = new MongoClient(settings);

以下示例显示如何指定多个身份验证机制属性:

var mongoClient = new MongoClient("mongodb://<db_username>:<db_password>@<hostname>/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:<service name>,SERVICE_REALM:<user's realm>");
var credential = MongoCredential.CreateGssapiCredential("<db_username>", "<db_password>");
credential = credential.WithMechanismProperty("SERVICE_REALM", "<user's realm>")
.WithMechanismProperty("SERVICE_NAME", "<service name>");
var settings = MongoClientSettings.FromConnectionString("<connection string>");
settings.Credential = credential;
var mongoClient = new MongoClient(settings);

您可以使用目录服务器用户名和密码向轻量级目录访问协议 (LDAP) 服务器进行身份验证。

以下示例使用以下占位符指定身份验证机制:

  • <username>:您的 LDAP 用户名

  • <password>:您的 LDAP 密码

  • <hostname>:您的 MongoDB Server 的网络地址,可由客户端访问

  • <authenticationDb>:包含用户的身份验证数据的 MongoDB 数据库

选择Connection StringMongoCredential标签页,查看指定 LDAP 身份验证机制的相应语法:

var mongoClient = new MongoClient("mongodb://<username>:<password>@<hostname>/?authSource=<authenticationDb>&authMechanism=PLAIN");
var credential = MongoCredential.CreatePlainCredential("<authenticationDb>", "<username>", "<password>");
var settings = MongoClientSettings.FromConnectionString("<connection string>");
settings.Credential = credential;
var mongoClient = new MongoClient(settings);

提示

该方法为 PLAIN 而不是 LDAP,因为它使用 RFC-4616 定义的 PLAIN 简单身份验证和安全层 (SASL) 进行身份验证。

重要

MONGODB-OIDC 身份验证机制要求在 Linux 平台上运行 MongoDB Server v 7.0或更高版本。

以下部分介绍如何使用 MONGODB-OIDC身份验证机制从各种平台进行身份验证。

有关 MONGODB-OIDC 身份验证机制的更多信息,请参阅 MongoDB Server 手册中的OpenID Connect 身份验证MongoDB Server 参数

如果应用程序在 Azure VM 上运行,或以其他方式使用 Azure 实例元数据服务 (IMDS),您可以使用 .NET/C# 驱动程序的内置 Azure 支持对 MongoDB 进行身份验证。

您可以使用Azure MongoClientSettingsMongoCredential对象或作为连接string 的一部分,对 对象指定 IMDS OIDC身份验证。选择Connection StringMongoCredential标签页,查看相应的语法。

以下代码示例演示如何指定Azure IMDS OIDC身份验证。 将<percent-encoded audience>占位符替换为MongoDB 部署上配置的audience参数的百分比编码值。

不能将包含逗号 ( , ) 字符的值传递给authMechanismProperties选项。 您必须在MongoCredential对象中指定包含逗号的值,如MongoCredential标签页中所示。

var connectionString = "mongodb://<db_username>@<hostname>[:<port>]/?" +
"authMechanism=MONGODB-OIDC" +
"&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>");
var mongoClientSettings = MongoClientSettings.FromConnectionString(connectionString);
var client = new MongoClient(mongoClientSettings);

以下代码示例演示如何指定Azure IMDS OIDC身份验证。 将<db_username>占位符替换为Azure托管身份或企业应用程序的客户端ID或应用程序 ID 。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。

var mongoClientSettings = MongoClientSettings.FromConnectionString(
"mongodb+srv://<hostname>[:<port>]");
mongoClientSettings.Credential = MongoCredential.CreateOidcCredential("azure", "<db_username>")
.WithMechanismProperty("TOKEN_RESOURCE", "<audience>");
var client = new MongoClient(mongoClientSettings);

如果您的应用程序在 Google Compute Engine 虚拟机上运行,或以其他方式使用 GCP实例元数据服务 ,您可以使用.NET/ C#驱动程序的内置GCP支持对MongoDB进行身份验证。

您可以使用GCP MongoClientSettingsMongoCredential对象或作为连接 的一部分在 对象上指定 IMDS OIDC身份验证。string选择Connection StringMongoCredential标签页,查看相应的语法。

以下代码示例演示如何指定GCP IMDS OIDC身份验证作为身份验证string的一部分。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。

不能将包含逗号 ( , ) 字符的值传递给authMechanismProperties选项。 您必须在MongoCredential对象中指定包含逗号的值,如MongoCredential标签页中所示。

var connectionString = "mongodb://<hostname>[:<port>]/?" +
"authMechanism=MONGODB-OIDC" +
"&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<audience>");
var mongoClientSettings = MongoClientSettings.FromConnectionString(connectionString);
var client = new MongoClient(mongoClientSettings);

以下代码示例演示如何使用MongoCredential对象指定GCP IMDS OIDC身份验证。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。

var mongoClientSettings = MongoClientSettings.FromConnectionString(
"mongodb+srv://<hostname>[:<port>]");
mongoClientSettings.Credential = MongoCredential.CreateOidcCredential("gcp")
.WithMechanismProperty("TOKEN_RESOURCE", "<audience>");
var client = new MongoClient(mongoClientSettings);

.NET/ C#驱动程序并不为所有平台提供内置支持,包括Azure Functions 和Azure Kubernetes Service (AKS)。 相反,您必须定义自定义回调,才能使用 OIDC 从这些平台进行身份验证。

首先,定义一个实现 IOidcCallback 接口的类。该接口包含两个方法:

  • GetOidcAccessToken():此方法接受回调方法的参数并返回回调响应。

  • GetOidcAccessTokenAsync():此方法是上一方法的异步版本。

以下代码是 IOidcCallback 接口的示例实现。在此示例中,这些方法从本地文件系统中名为 "access-token.dat" 的文件检索 OIDC 令牌。

public class MyCallback : IOidcCallback
{
public OidcAccessToken GetOidcAccessToken(
OidcCallbackParameters parameters,
CancellationToken cancellationToken)
{
var accessToken = File.ReadAllText("access-token.dat");
return new(accessToken, expiresIn: null);
}
public async Task<OidcAccessToken> GetOidcAccessTokenAsync(
OidcCallbackParameters parameters,
CancellationToken cancellationToken)
{
var accessToken = await File.ReadAllTextAsync(
"access-token.dat",
cancellationToken)
.ConfigureAwait(false);
return new(accessToken, expiresIn: null);
}
}

定义包含自定义回调方法的类后,调用MongoCredential.CreateOidcCredential()方法并传入该类的新实例。 将此方法调用的结果存储在MongoClientSettings对象的Credential属性中,如以下代码示例:

var mongoClientSettings = MongoClientSettings.FromConnectionString("mongodb://<hostname>[:port]");
mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new MyCallback());
var client = new MongoClient(mongoClientSettings);

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

后退

身份验证