.NET Core如何通过SSL访问MongoDB?

ccbe67e449490b6d369941d7c808a159.jpeg

【.NET Core】| 总结/Edison Zhou


大家好,我是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 ConfigurationMongoClientSettings settings = new MongoClientSettings{ApplicationName = ApplicationName,ReplicaSetName = ReplicaSetName};// Credentialif (string.IsNullOrWhiteSpace(AuthDatabaseName))settings.Credential = MongoCredential.CreateCredential(DatabaseName, UserName, Password);elsesettings.Credential = MongoCredential.CreateCredential(AuthDatabaseName, UserName, AuthDatabaseName);// Serversvar 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;}// SSLif (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 Doc

7c532dfbf4bb8c57d329e56cea01e382.gif

年终总结:Edison的2021年终总结

数字化转型:我在传统企业做数字化转型

C#刷题:C#刷剑指Offer算法题系列文章目录

.NET面试:.NET开发面试知识体系

.NET大会:2020年中国.NET开发者大会PDF资料

5b9b3e8583f13e8e740fc760b359f3cf.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQA

一、长大一条龙SQA计划 SQA计划需要包含软件工程质量保证、质量控制、数据收集和统计报告这四方面内容&#xff0c;计划以时间为线索&#xff0c;小组内成员为对象&#xff0c;以下为我组的工作计划&#xff1a; 时间 任务 需完成的情况 2017年10月 用户登录注册后台实现 …

在pom.xml中配置nexus上传地址

2019独角兽企业重金招聘Python工程师标准>>> <distributionManagement> <repository> <id>thirdparty</id> <url>http://&#xff5b;nexusIP地址&#xff5d;:8081/nexus/content/repositories/thi…

网页背景平铺_在大约十秒钟内为网页创建无缝平铺背景

网页背景平铺Creating a background image for your webpage (or desktop background) isn’t challenging at all. In fact, even a newbie Photoshop user can bash one out in about ten seconds. Here’s the simplest of simple methods with surprising, great results. …

9月11日学习内容整理:正则表达式,re模块

一、正则表达式&#xff1a;正则是很大的一个知识点&#xff0c;不会仅仅是下面这些东西 1、概念&#xff1a;正则表达式就是一种对字符串匹配的规则&#xff0c;注意是只对字符串&#xff0c;正则表达式和python没啥关系&#xff0c; 2、表达式&#xff1a; &#xff08;1&…

rest_framework02:修改数据/校验钩子/read_only和write_only

修改数据 1.传入数据&#xff0c;选中data&#xff0c;以及修改data book_ser BookSerializer(instancebook, datarequest.data) 2.校验&#xff0c;通过则保存。 if book_ser.is_valid(): # 返回True 表示验证通过book_ser.save() # 不是book.save() rest_framework…

MongoDB的安装与使用

MongoDB是一款NoSql数据库。NoSql数据库叫非关系型数据库&#xff0c;NoSql的全名Not only sql。是为了解决高并发、高可用、高可扩展&#xff0c;以及大数据存储等一系列问题而产生的数据库解决方案。NoSql&#xff0c;它不能替代关系型数据库&#xff0c;只能作为关系型数据库…

linux 基准测试_如何对Linux系统进行基准测试:3个开源基准测试工具

linux 基准测试Linux’s command-line utilities can do anything, including perform benchmarks – but using a dedicated benchmarking program is a simpler and more foolproof process. These utilities allow you to perform reproducible tests across different syst…

.NET 7 新增的 IParsable 接口介绍

.NET 7 是一个新版本的 .NET&#xff0c;它新增了一个名为 IParsable 的接口。这个接口可以帮助开发人员更容易地在代码中解析字符串。IParsable 接口包含两个方法&#xff1a;Parse 和 TryParse。Parse 方法用于将一个字符串解析为指定类型的值。如果解析失败&#xff0c;则会…

CentOS 7安装nginx+php+mysql环境

0x01 安装php 1、首先得安装第三方软件库 yum install epel-release 复制代码2、安装依赖包 yum install gcc gcc-c glibc libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-de…

spring+springMvc+struts的SSH框架整合

1.建立一个web项目 2.导入SSH框架所需jar包 3.配置web.xml文件 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:sc…

听说这个语言认知服务又出新功能了?

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;7分钟)语言是人类智能发展的基石。鉴于语言拥有普遍性&#xff0c;几乎没有特定的技术或 AI 技术得以颠覆整个社会。微软的使命是赋能地球上的每个人和每个组织&#xff0c;帮助他们取得更多成就。立足于该使命&#…

强大的XML

2018-04-23 20:29:26 XML&#xff1a;Extensible Markup Language&#xff0c;也就是可扩展标记语言。XML和HTML格式是古老的标记通用语言SGML的衍生语言。 XML文件是可以用来作为配置文件的&#xff0c;相比于其他配置文件的规范&#xff0c;XML的好处在于通过自定义的标记&am…

rest_framework03:查询所有/新增数据/删除一个数据/封装Response/序列化与反序列化

查询所有 1.创建新clase和url&#xff0c;避免与查询一个功能逻辑混乱。 2.增加manyTrue&#xff0c; book_serBookSerializer(books,manyTrue) urls.py: path(books/,views.BooksView.as_view()) views.py class BooksView(APIView):def get(self,request):response_msg …

如何对DevOps数据库进行源代码控制

提纲&#xff1a; 包括索引在内的数据库模式需要进行源代码控制诸如查询表这类用于控制业务逻辑的数据需要进行源代码控制开发人员需要一种能够便捷地创建本地数据库的方法共享数据库的更新只能通过构建服务器完成 健壮的DevOps环境需要对系统的每个组件进行持续集成。但是&…

自定义异常最佳实践_播放,自定义和组织媒体的最佳文章

自定义异常最佳实践Computers today are used for much more than generating documents, writing and receiving email, and surfing the web. We also use them to listen to music, watch movies and TV shows, and to transfer media to and from mobile devices. 如今&…

CSS中的路径裁剪样式clip-path

前面的话 CSS借鉴了SVG裁剪的概念&#xff0c;设置了clip-path样式&#xff0c;本文将详细介绍路径裁剪clip-path 概述 clip-path属性可以防止部分元素通过定义的剪切区域来显示&#xff0c;仅通过显示的特殊区域。剪切区域是被URL定义的路径代替行内或者外部svg&#xff0c;或…

socket编程学习笔记

socket编程&#xff1a; 1、网络基础知识 两台计算机通过网络进行通信&#xff0c;首先两台计算机要有唯一的标识&#xff0c;即唯一的IP地址。其次他们要有共同的语言用来交流即协议。再者&#xff0c;每套主机要有相应的端口号。  TCP/IP协议&#xff1a;   --TCP/IP协议是…

rest_framework04:ModelSerializer/Serializer高级用法

ModelSerializer 1.减小序列化类代码 2.不需要重写update&#xff0c;create ser.py class BookModelSerializer(serializers.ModelSerializer):class Meta:modelBookfields__all__ #序列化全部字段# fields(name,price) # 序列化指定字段# exclude(name,) # 与fields 不能…

配置本地及网络yum源(详细步骤)

我们以centos6为范例演示 1、[rootCentos6 ~]# cd /etc/yum.repos.d/ [rootCentos6 yum.repos.d]# ls CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repoCentOS-Debuginfo.repo CentOS-Media.repo先罗列出相关文件 2、[rootCentos6 yum.repos.d]# vim CentOS-Base.rep…

macos mojave_如何修复macOS Mojave上的模糊字体(使用亚像素抗锯齿)

macos mojaveApple’s macOS Mojave disables subpixel antialiasing, also known as font smoothing, by default. On a MacBook Air or a desktop Mac hooked up to a non-Retina display, upgrading will make your fonts look worse. 苹果的macOS Mojave默认情况下禁用子像…