.NET Core应用如何通过SSL访问MongoDB?
大家好,我是Edison。
最近有一个ASP.NET Core通过SSL证书访问MongoDB的需求,但是在网上发现资料很少,于是调查了一番,做了如下的笔记,希望对你有用。
背景
在实际场景中,开发环境的MongoDB服务器一般没有要求通过SSL方式来登陆,但是生产环境的MongoDB服务器通常都会基于安全要求基于SSL方式来访问,这就要求客户端应用需要通过SSL证书来和MongoDB服务器进行通信验证后才能正常读取和写入数据。

那么,在ASP.NET Core应用中应该如何修改匹配呢?今天,我们就来看一看。
修改
通过学习MongoDB.Driver后,在实例化MongoClient时可以通过传递一个MongoClientSettings类来进行自定义参数的实例化,而这个MongoClientSettings类提供的参数比较丰富,我们可以将这些参数配置在appsettings中进行分环境的自定义。
var mongoClient = new MongoClient(new MongoClientSettings());
因此,我们可以写一个MongoSettings类来读取appsettings中的配置生成一个MongoClientSettings,这里给出一个参考示例。
using MongoDB.Driver;
using System.Security.Cryptography.X509Certificates; namespace EDT.Todo.Data.Persistance
{
/// <summary>
/// Generate MongoClientSettings
/// </summary>
public class MongoSettings
{
public string Servers { get; set; }
public int Port { get; set; } = 27017;
public string ReplicaSetName { get; set; }
public string DatabaseName { get; set; }
public string DefaultCollectionName { get; set; } = string.Empty;
public string ApplicationName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string AuthDatabaseName { get; set; } = string.Empty;
public string CustomProperties { get; set; } = string.Empty;
public bool UseTLS { get; set; } = false;
public bool AllowInsecureTLS { get; set; } = true;
public string ClientCertificatePath { get; set; } = string.Empty;
public bool StoreCertificateInKeyStore { get; set; } = false; public MongoClientSettings GetMongoClientSettings()
{
if (string.IsNullOrWhiteSpace(Servers))
throw new ArgumentNullException("Mongo Servers Configuration is Missing!"); if (string.IsNullOrWhiteSpace(UserName) || string.IsNullOrWhiteSpace(Password))
throw new ArgumentNullException("Mongo Account Configuration is Missing!"); // Base Configuration
MongoClientSettings settings = new MongoClientSettings
{
ApplicationName = ApplicationName,
ReplicaSetName = ReplicaSetName
}; // Credential
if (string.IsNullOrWhiteSpace(AuthDatabaseName))
settings.Credential = MongoCredential.CreateCredential(DatabaseName, UserName, Password);
else
settings.Credential = MongoCredential.CreateCredential(AuthDatabaseName, UserName, AuthDatabaseName); // Servers
var mongoServers = Servers.Split(",", StringSplitOptions.RemoveEmptyEntries).ToList();
if (mongoServers.Count == 1)
{
settings.Server = new MongoServerAddress(mongoServers.First(), Port);
settings.DirectConnection = true;
} if (mongoServers.Count > 1)
{
var mongoServerAddresses = new List<MongoServerAddress>();
foreach (var mongoServer in mongoServers)
{
var mongoServerAddress = new MongoServerAddress(mongoServer, Port);
mongoServerAddresses.Add(mongoServerAddress);
}
settings.Servers = mongoServerAddresses;
settings.DirectConnection = false;
} // SSL
if (UseTLS)
{
settings.UseTls = true;
settings.AllowInsecureTls = AllowInsecureTLS;
if (string.IsNullOrWhiteSpace(ClientCertificatePath))
throw new ArgumentNullException("ClientCertificatePath is Missing!");
var certs = new List<X509Certificate> { new X509Certificate2(ClientCertificatePath) };
settings.SslSettings = new SslSettings();
settings.SslSettings.ClientCertificates = certs;
settings.SslSettings.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls13;
} return settings;
}
}
}
对于原有的Repository类,我们则需要做一点点修改,从IoC容器中获取MongoSettings的实例,并通过调用GetMongoClientSettings方法获取到生成的这个具体的MongoClientSettings对象:
public class TodoItemRepository : ITodoItemRepository
{
private readonly ILogger<TodoItemRepository> _logger;
private readonly IMongoCollection<TodoItem> _todoItems; public TodoItemRepository(MongoSettings settings, ILogger<TodoItemRepository> logger)
{
var mongoClient = new MongoClient(settings.GetMongoClientSettings());
var mongoDatabase = mongoClient.GetDatabase(settings.DatabaseName);
_todoItems = mongoDatabase.GetCollection<TodoItem>(settings.DefaultCollectionName);
_logger = logger;
} ......
}
在Program.cs中将MongoSettings和appsettings中的配置绑定:
builder.Services.Configure<MongoSettings>(
builder.Configuration.GetSection("MongoDatabase"));
builder.Services.AddSingleton(sp =>
sp.GetRequiredService<IOptions<MongoSettings>>().Value);
......
builder.Services.AddSingleton<ITodoItemRepository, TodoItemRepository>();
针对Development环境的appsettings:
{
......
"MongoDatabase": {
"Servers": "dev.mongodb01.com,dev.mongodb01.com,dev.mongodb01.com",
"Port": 27017,
"ReplicaSetName": "testrplica",
"DatabaseName": "TestDB",
"DefaultCollectionName": "TodoItems",
"ApplicationName": "Todo",
"UserName": "dev_mongo_user",
"Password": "passwordfordevuser",
"UseTLS": false
}
}
针对Production环境的appsettings:
{
......
"MongoDatabase": {
"Servers": "prd.mongo01.com,prd.mongo02.com,prd.mongo03.com",
"Port": 27007,
"ReplicaSetName": "testreplica",
"DatabaseName": "TestDB",
"DefaultCollectionName": "TodoItems",
"ApplicationName": "Todo",
"UserName": "prd_mongo_user",
"Password": "passwordforprduser",
"UseTLS": true,
"AllowInsecureTLS": true,
"ClientCertificatePath": "resources/certificates/intranet_server_ca.cer"
}
}
既然是通过证书访问,那么我们得告诉ASP.NET Core这个证书放在什么位置,本文示例是放在这个ASP.NET Core应用目录下的,在实际中建议由运维管理员统一放在一个中心服务器位置,挂载到容器内部可以访问,从而保证证书的安全。如果使用了K8s,还可以将证书作为Secret统一存放。
小结
本文介绍了在ASP.NET Core中如何配置和实现基于SSL证书的方式访问MongoDB数据库,希望对你有所帮助!
参考资料
MongoDB.Driver官方文档

.NET Core应用如何通过SSL访问MongoDB?的更多相关文章
- Spring-boot访问MongoDB
1.访问配置信息 package hello; import org.springframework.context.annotation.Bean; import org.springframewo ...
- 使用spring boot访问mongodb数据库
一. spring boot中传参的方法 1.自动化配置 spring Boot 对于开发人员最大的好处在于可以对 Spring 应用进行自动配置.Spring Boot 会根据应用中声明的第三方依赖 ...
- HttpClient4.5 SSL访问工具类
要从网上找一个HttpClient SSL访问工具类太难了,原因是HttpClient版本太多了,稍有差别就不能用,最后笔者干脆自己封装了一个访问HTTPS并绕过证书工具类. 主要是基于新版本Http ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- mongodb3.6 (五)net 客户端访问mongodb设置超时时间踩过的“坑”
前言 在上一篇文章中,我们有提到net访问mongodb连接超时默认为30秒,这个时间在实际项目中肯定是太长的.而MongoClientSettings 也确是提供了超时属性,如下图: 可实际使用中, ...
- HTTPS笔记:使用 SSLEngine 为 aioserver 服务器提供 SSL 访问支持
现在 HTTPS 的普及率是越来越高,闲来无事,花了二三天时间,为五年前写的 aioserver 服务器提供了 SSL 访问支持. 查看网上资料,为了提高服务器的高并发,建议使用:SSLEngine ...
- Python访问MongoDB,并且转换成Dataframe
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/7/13 11:10 # @Author : baoshan # @Site ...
- Java 调用 groovy 脚本文件,groovy 访问 MongoDB
groovy 访问 MongoDB 示例: shell.groovy package db import com.gmongo.GMongoClient import com.mongodb.Basi ...
- 使用Go客户端访问MongoDB
1.安装MongoDB 1.1 到官网:www.mongodb.org/downloads下载windows最新版本,解压到目标目录下. 1.2 创建数据存储目录 mongodb需要一个数据文件夹来保 ...
- 使用SQL访问MongoDB
使用SQL访问MongoDB 简介 使用SQL访问MongoDB有多种解决方案,就我所知的,除了今天要介绍的MongoDB Connector for BI外,还有Studio 3T,但后者只有在企业 ...
随机推荐
- 深入理解Hadoop读书笔记-2
背景 公司的物流业务系统目前实现了使用storm集群进行过门事件的实时计算处理,但是还有一个需求,我们需要存储每个标签上传的每条明细数据,然后进行定期的标签报表统计,这个是目前的实时计算框架无法满足的 ...
- 【前端JSP思考】JSP中#{},${}和%{}的区别
JSP中#{},${}和%{}的区别: #{} #{}:对语句进行预编译,此语句解析的是占位符?,可以防止SQL注入, 比如打印出来的语句 select * from table where id=? ...
- Git 覆盖刚刚 commit 的 message
场景重现 通常噼里啪啦键盘一段猛搓后(写代码啊),然后会 git add . git commit -m "modify semo" # 注意上面 semo 应该是 some,发现 ...
- SpringAI vs JBoltAI:Java企业级AI开发的框架之争与实战选型
「SpringAI vs JBoltAI:Java企业级AI开发的框架之争与实战选型」 一.Java生态的AI困局:工具碎片化与工程化缺失 1. 技术断层:从API调用到全生命周期管理多数企业仍停留在 ...
- nodejs参数的处理与用户的交互
解析脚本参数 作为脚本或者命令行工具,一般都需要支持不同的用户参数.默认参数被保存在process.argv的数组中,如下: [ nodeBinary, script, arg0, arg1, ... ...
- FastAPI依赖覆盖与测试环境模拟
title: FastAPI依赖覆盖与测试环境模拟 date: 2025/04/10 00:58:09 updated: 2025/04/10 00:58:09 author: cmdragon ex ...
- Rust+appium App自动化测试demo
1.新建工程 打开RustCover,新建工程如下: 修改Cargo.toml文件如下: [package] name = "test_demo" version = " ...
- 如何在 Java 中进行内存泄漏分析?
如何在 Java 中进行内存泄漏分析? 内存泄漏是指程序中无法访问的对象仍然被占用内存,导致内存无法回收,最终导致内存不足.程序崩溃等问题.Java 中的内存泄漏通常与垃圾回收机制的工作方式相关,虽然 ...
- .NET Core中的配置Configuration实战
在前面的一篇文章中,我们对.NET 中的配置Configuration进行了一个详细的介绍,并且从整个源码的解读解释了配置中的核心接口以及主要的实现类.文章链接为:https://cshellowor ...
- wpf 打开输入法、禁用输入法
1 <StackPanel Margin="10"> 2 <TextBox Text="默认"></TextBox> 3 & ...