lith 3 жил өмнө
parent
commit
c1daecd248

+ 16 - 4
dotnet/Library/Vit/Vit.WebHost/Extensions/IWebHostBuilderExtensions_UseUrlsFromConfig.cs

@@ -8,18 +8,30 @@ namespace Vit.Extensions
         /// Specify the urls the web host will listen on.
         /// </summary>
         /// <param name="data"></param>
-        /// <param name="configPath">在appsettings.json文件中的路径。默认:"server.urls"。其指定的值必须为字符串数组。</param>
+        /// <param name="urlsPath">在appsettings.json文件中的路径。默认:"server.urls"。其指定的值必须为字符串数组。</param>
+        /// <param name="certificatesPath">在appsettings.json文件中的路径。默认:"server.certificates"。</param>
         /// <returns></returns>
-        public static IWebHostBuilder UseUrlsFromConfig(this IWebHostBuilder data, string configPath = "server.urls")
+        public static IWebHostBuilder UseUrlsFromConfig(this IWebHostBuilder data, string urlsPath = "server.urls", string certificatesPath = "server.certificates")
         {
             if (data == null) return data;
 
-            var urls = Vit.Core.Util.ConfigurationManager.ConfigurationManager.Instance.GetByPath<string[]>("server.urls");
-
+            #region (x.1)urls         
+            var urls = Vit.Core.Util.ConfigurationManager.ConfigurationManager.Instance.GetByPath<string[]>(urlsPath);
             if (urls != null && urls.Length > 0)
             {
                 data.UseUrls(urls);
             }
+            #endregion
+
+
+            #region (x.2)certificates
+            if (!string.IsNullOrEmpty(certificatesPath))
+            {
+                data.UseCertificates(certificatesPath);
+            }
+            #endregion
+
+
             return data;
         }
     }

+ 77 - 0
dotnet/Library/Vit/Vit.WebHost/Extensions/UseCertificates/IServiceCollectionExtensions_UseCertificates.cs

@@ -0,0 +1,77 @@
+using Microsoft.Extensions.DependencyInjection;
+using System.Collections.Generic;
+using System.Security.Cryptography.X509Certificates;
+using Vit.Core.Util.Common;
+
+namespace Vit.Extensions
+{
+    public static partial class IServiceCollectionExtensions_UseCertificates
+    {
+        /// <summary>
+        /// 加载https证书 
+        /// <example>
+        /// <code>
+        ///   //appsettings.json
+        ///   //...
+        ///   "server": {
+        ///    /* https证书配置,可不指定。若urls中指定了https协议,请在此指定对应的https证书 */
+        ///    "certificates": [
+        ///      {
+        ///        "filePath": "data/serset-com-iis-0923120142.pfx",
+        ///        "password": "password"
+        ///      }
+        ///    ]
+        ///   },
+        ///   //...        
+        /// </code>
+        /// </example>
+        /// 
+        /// </summary>
+        /// <param name="data"></param>
+        /// <param name="configPath">在appsettings.json文件中的路径。默认:"server.certificates"。</param>
+        /// <returns></returns>
+        public static IServiceCollection UseCertificates(this IServiceCollection data, string configPath = "server.certificates")
+        {
+
+            //var certificate = new X509Certificate2(@"L:\Code\AliSvn\Lith\ssl证书\sersit-com-iis-0923120142.pfx", "Admin0123");
+            ////var dnsName = certificate.GetNameInfo(X509NameType.SimpleName, false);
+            //var dnsName = certificate.GetNameInfo(X509NameType.DnsName, false);
+
+
+            //(x.1)构建证书字典
+            X509Certificate2 defaultCert = null;
+            Dictionary<string, X509Certificate2> certMap = new Dictionary<string, X509Certificate2>();
+            foreach (var item in Vit.Core.Util.ConfigurationManager.ConfigurationManager.Instance.GetByPath<Newtonsoft.Json.Linq.JArray>(configPath)
+                ?? new Newtonsoft.Json.Linq.JArray())
+            {
+                var certificate = new X509Certificate2(CommonHelp.GetAbsPath(item["filePath"].ToString()), item["password"].ToString());
+                var dnsName = certificate.GetNameInfo(X509NameType.DnsName, false);
+                certMap[dnsName] = certificate;
+
+                defaultCert = certificate;
+            }
+
+            if (defaultCert != null)
+            {
+                data?.Configure((Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerOptions options) =>
+                {
+                    options.ConfigureHttpsDefaults(httpsOptions =>
+                    {
+                        httpsOptions.ServerCertificateSelector = (context, name) =>
+                            {
+                                if (name != null && certMap.TryGetValue(name, out var cert))
+                                {
+                                    return cert;
+                                }
+                                return defaultCert;
+                            };
+                    });
+                });
+            }
+
+            return data;
+        }
+
+
+    }
+}

+ 36 - 0
dotnet/Library/Vit/Vit.WebHost/Extensions/UseCertificates/IWebHostBuilderExtensions_UseCertificates.cs

@@ -0,0 +1,36 @@
+using Microsoft.AspNetCore.Hosting;
+
+namespace Vit.Extensions
+{
+    public static partial class IWebHostBuilderExtensions_UseCertificates
+    {
+        /// <summary>
+        /// 加载https证书 
+        /// <example>
+        /// <code>
+        ///   //appsettings.json
+        ///   //...
+        ///   "server": {
+        ///    /* https证书配置,可不指定。若urls中指定了https协议,请在此指定对应的https证书 */
+        ///    "certificates": [
+        ///      {
+        ///        "filePath": "data/serset-com-iis-0923120142.pfx",
+        ///        "password": "password"
+        ///      }
+        ///    ]
+        ///   },
+        ///   //...        
+        /// </code>
+        /// </example>
+        /// 
+        /// </summary>
+        /// <param name="data"></param>
+        /// <param name="configPath">在appsettings.json文件中的路径。默认:"server.certificates"。</param>
+        /// <returns></returns>
+        public static IWebHostBuilder UseCertificates(this IWebHostBuilder data, string configPath = "server.certificates")
+        {
+            data?.ConfigureServices(services=> services.UseCertificates(configPath)); 
+            return data;
+        }
+    }
+}