Ver Fonte

更新1.4.0
新增 支持JWT和IS4认证切换
新增 集成统一认证授权项目Admin.IdentityServer
更新 后端nuget包
调整 data.json用户数据
修复 分页根据条件查询后没有从第一页开始的问题
修复 执行db方法显示启动端口不按顺序执行的问题
修复 swagger api加权小锁弹出无输入框的问题
修复 刷新token执行成功,请求重试执行失败会循环执行的问题
修复 token以旧换新刷新时间不精确的问题
修复 ip带端口验证ip不通过返回本地ip的问题

xiaoxue há 4 anos atrás
pai
commit
3e355b5a12

+ 10 - 10
Admin.Core.Common/Admin.Core.Common.csproj

@@ -3,7 +3,7 @@
   <PropertyGroup>
     <TargetFramework>netcoreapp3.1</TargetFramework>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-    <Version>1.3.4</Version>
+    <Version>1.4.0</Version>
     <Authors>xiaoxue</Authors>
     <Company>xiaoxue</Company>
     <Description>中台Admin后端通用库</Description>
@@ -22,20 +22,20 @@
 
   <ItemGroup>
     <PackageReference Include="CSRedisCore" Version="3.6.5" />
-    <PackageReference Include="FreeSql" Version="1.6.0-preview0602" />
-    <PackageReference Include="FreeSql.Provider.MySql" Version="1.6.0-preview0602" />
-    <PackageReference Include="FreeSql.Provider.Oracle" Version="1.6.0-preview0602" />
-    <PackageReference Include="FreeSql.Provider.PostgreSQL" Version="1.6.0-preview0602" />
-    <PackageReference Include="FreeSql.Provider.Sqlite" Version="1.6.0-preview0602" />
-    <PackageReference Include="FreeSql.Provider.SqlServer" Version="1.6.0-preview0602" />
-    <PackageReference Include="FreeSql.Repository" Version="1.6.0-preview0602" />
+    <PackageReference Include="FreeSql" Version="1.6.0" />
+    <PackageReference Include="FreeSql.Provider.MySql" Version="1.6.0" />
+    <PackageReference Include="FreeSql.Provider.Oracle" Version="1.6.0" />
+    <PackageReference Include="FreeSql.Provider.PostgreSQL" Version="1.6.0" />
+    <PackageReference Include="FreeSql.Provider.Sqlite" Version="1.6.0" />
+    <PackageReference Include="FreeSql.Provider.SqlServer" Version="1.6.0" />
+    <PackageReference Include="FreeSql.Repository" Version="1.6.0" />
     <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
     <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.5" />
     <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.5" />
     <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.5" />
-    <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.6.0" />
+    <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.7.1" />
     <PackageReference Include="System.Drawing.Common" Version="4.7.0" />
-    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.6.0" />
+    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.7.1" />
     <PackageReference Include="UAParser" Version="3.1.44" />
   </ItemGroup>
 

+ 33 - 0
Admin.Core.Common/Auth/ClaimAttributes.cs

@@ -0,0 +1,33 @@
+namespace Admin.Core.Common.Auth
+{
+    /// <summary>
+    /// Claim属性
+    /// </summary>
+    public static class ClaimAttributes
+    {
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public const string UserId = "id";
+
+        /// <summary>
+        /// 认证授权用户Id
+        /// </summary>
+        public const string IdentityServerUserId = "sub";
+
+        /// <summary>
+        /// 用户名
+        /// </summary>
+        public const string UserName = "na";
+
+        /// <summary>
+        /// 姓名
+        /// </summary>
+        public const string UserNickName = "nn";
+
+        /// <summary>
+        /// 刷新有效期
+        /// </summary>
+        public const string RefreshExpires = "re";
+    }
+}

+ 1 - 27
Admin.Core.Common/Auth/User.cs

@@ -18,7 +18,7 @@ namespace Admin.Core.Common.Auth
         /// <summary>
         /// 用户Id
         /// </summary>
-        public long Id
+        public virtual long Id
         {
             get
             {
@@ -67,30 +67,4 @@ namespace Admin.Core.Common.Auth
             }
         }
     }
-
-    /// <summary>
-    /// Claim属性
-    /// </summary>
-    public static class ClaimAttributes
-    {
-        /// <summary>
-        /// 用户Id
-        /// </summary>
-        public const string UserId = "id";
-
-        /// <summary>
-        /// 用户名
-        /// </summary>
-        public const string UserName = "na";
-
-        /// <summary>
-        /// 姓名
-        /// </summary>
-        public const string UserNickName = "nn";
-
-        /// <summary>
-        /// 刷新有效期
-        /// </summary>
-        public const string RefreshExpires = "re";
-    }
 }

+ 34 - 0
Admin.Core.Common/Auth/UserIdentiyServer.cs

@@ -0,0 +1,34 @@
+using Microsoft.AspNetCore.Http;
+using Admin.Core.Common.Helpers;
+
+namespace Admin.Core.Common.Auth
+{
+    /// <summary>
+    /// 用户信息
+    /// </summary>
+    public class UserIdentiyServer : User
+    {
+        private readonly IHttpContextAccessor _accessor;
+
+        public UserIdentiyServer(IHttpContextAccessor accessor) : base(accessor)
+        {
+            _accessor = accessor;
+        }
+
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public override long Id
+        {
+            get
+            {
+                var id = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.IdentityServerUserId);
+                if (id != null && id.Value.NotNull())
+                {
+                    return id.Value.ToLong();
+                }
+                return 0;
+            }
+        }
+    }
+}

+ 3 - 2
Admin.Core.Common/Auth/UserToken.cs

@@ -7,6 +7,7 @@ using Microsoft.IdentityModel.Tokens;
 using Admin.Core.Common.Configs;
 using Admin.Core.Common.Attributes;
 using System.Linq;
+using Admin.Core.Common.Extensions;
 
 namespace Admin.Core.Common.Auth
 {
@@ -24,8 +25,8 @@ namespace Admin.Core.Common.Auth
         {
             var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtConfig.SecurityKey));
             var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
-            var refreshExpires = DateTime.Now.AddMinutes(_jwtConfig.RefreshExpires).ToString();
-             claims = claims.Append(new Claim(ClaimAttributes.RefreshExpires, refreshExpires)).ToArray();
+            var timestamp = DateTime.Now.AddMinutes(_jwtConfig.Expires + _jwtConfig.RefreshExpires).ToTimestamp().ToString();
+             claims = claims.Append(new Claim(ClaimAttributes.RefreshExpires, timestamp)).ToArray();
 
             var token = new JwtSecurityToken(
                 issuer: _jwtConfig.Issuer,

+ 24 - 4
Admin.Core.Common/Configs/AppConfig.cs

@@ -6,20 +6,25 @@
     public class AppConfig
     {
         /// <summary>
-        /// Api地址,默认 http://*:8888
+        /// Api地址,默认 http://*:8000
         /// </summary>
-        public string[] Urls { get; set; }// = new[]{ "http://*:8888" };
+        public string[] Urls { get; set; }// = new[]{ "http://*:8000" };
 
         /// <summary>
-        /// 跨域地址,默认 http://*:9999
+        /// 跨域地址,默认 http://*:9000
         /// </summary>
-        public string[] CorUrls { get; set; }// = new[]{ "http://*:9999" };
+        public string[] CorUrls { get; set; }// = new[]{ "http://*:9000" };
 
         /// <summary>
         /// Swagger文档
         /// </summary>
         public bool Swagger { get; set; } = false;
 
+        /// <summary>
+        /// 统一认证授权服务器
+        /// </summary>
+        public IdentityServer IdentityServer { get; set; } = new IdentityServer();
+
         /// <summary>
         /// Aop配置
         /// </summary>
@@ -41,6 +46,21 @@
         public VarifyCodeConfig VarifyCode { get; set; } = new VarifyCodeConfig();
     }
 
+    /// <summary>
+    /// 统一认证授权服务器配置
+    /// </summary>
+    public class IdentityServer
+    {
+        /// <summary>
+        /// 启用
+        /// </summary>
+        public bool Enable { get; set; } = false;
+        /// <summary>
+        /// 地址
+        /// </summary>
+        public string Url { get; set; } = "https://localhost:5000";
+    }
+
     /// <summary>
     /// Aop配置
     /// </summary>

+ 36 - 0
Admin.Core.Common/Extensions/DateTimeExtensions.cs

@@ -0,0 +1,36 @@
+using System;
+
+namespace Admin.Core.Common.Extensions
+{
+    public static class DateTimeExtensions
+    {
+        /// <summary>
+        /// 时间戳起始日期
+        /// </summary>
+        public static DateTime TimestampStart = new DateTime(1970, 1, 1, 0, 0, 0, 0);
+
+        /// <summary>
+        /// 转换为时间戳
+        /// </summary>
+        /// <param name="dateTime"></param>
+        /// <param name="milliseconds">是否使用毫秒</param>
+        /// <returns></returns>
+        public static long ToTimestamp(this DateTime dateTime, bool milliseconds = false)
+        {
+            var timestamp = dateTime.ToUniversalTime() - TimestampStart;
+            return (long)(milliseconds ? timestamp.TotalMilliseconds : timestamp.TotalSeconds);
+        }
+
+        /// <summary>
+        /// 获取周几
+        /// </summary>
+        /// <param name="datetime"></param>
+        /// <returns></returns>
+        public static string GetWeekName(this DateTime datetime)
+        {
+            var day = (int)datetime.DayOfWeek;
+            var week = new string[] { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
+            return week[day];
+        }
+    }
+}

+ 1 - 1
Admin.Core.Common/Helpers/IPHelper.cs

@@ -38,7 +38,7 @@ namespace Admin.Core.Common.Helpers
             {
                 ip = request.HttpContext?.Connection?.RemoteIpAddress?.ToString();
             }
-            if (ip.IsNull() || !IsIP(ip))
+            if (ip.IsNull() || !IsIP(ip.Split(":")[0]))
             {
                 ip = "127.0.0.1";
             }

+ 8 - 3
Admin.Core.Common/Helpers/UtilConvert.cs

@@ -109,7 +109,7 @@ namespace Admin.Core.Common.Helpers
             return errorValue;
         }
         
-        public static DateTime ToDate(this object thisValue)
+        public static DateTime ToDateTime(this object thisValue)
         {
             DateTime reval = DateTime.MinValue;
             if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval))
@@ -119,7 +119,7 @@ namespace Admin.Core.Common.Helpers
             return reval;
         }
         
-        public static DateTime ToDate(this object thisValue, DateTime errorValue)
+        public static DateTime ToDateTime(this object thisValue, DateTime errorValue)
         {
             DateTime reval;
             if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval))
@@ -128,7 +128,12 @@ namespace Admin.Core.Common.Helpers
             }
             return errorValue;
         }
-        
+
+        public static DateTime ToDateTime(this long milliseconds)
+        {
+            return Extensions.DateTimeExtensions.TimestampStart.AddMilliseconds(milliseconds);
+        }
+
         public static bool ToBool(this object thisValue)
         {
             bool reval = false;

+ 1 - 1
Admin.Core.Model/Admin.Core.Model.csproj

@@ -3,7 +3,7 @@
   <PropertyGroup>
     <TargetFramework>netcoreapp3.1</TargetFramework>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-    <Version>1.3.4</Version>
+    <Version>1.4.0</Version>
     <Authors>xiaoxue</Authors>
     <Company>xiaoxue</Company>
     <Description>中台Admin后端实体库</Description>

+ 1 - 1
Admin.Core.Repository/Admin.Core.Repository.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <TargetFramework>netcoreapp3.1</TargetFramework>
-    <Version>1.3.4</Version>
+    <Version>1.4.0</Version>
     <Authors>xiaoxue</Authors>
     <Company>xiaoxue</Company>
     <Description>中台Admin后端仓储库</Description>

+ 3 - 3
Admin.Core.Services/Admin.Core.Service.csproj

@@ -3,7 +3,7 @@
   <PropertyGroup>
     <TargetFramework>netcoreapp3.1</TargetFramework>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-    <Version>1.3.4</Version>
+    <Version>1.4.0</Version>
     <Authors>xiaoxue</Authors>
     <Company>xiaoxue</Company>
     <Description>中台Admin后端服务库</Description>
@@ -30,8 +30,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="AutoMapper" Version="9.0.0" />
-    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="AutoMapper" Version="10.0.0" />
+    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.0.0" />
   </ItemGroup>
 
   <ItemGroup>

+ 75 - 20
Admin.Core/Admin.Core.Common.xml

@@ -24,6 +24,36 @@
             事务隔离级别
             </summary>
         </member>
+        <member name="T:Admin.Core.Common.Auth.ClaimAttributes">
+            <summary>
+            Claim属性
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.UserId">
+            <summary>
+            用户Id
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.IdentityServerUserId">
+            <summary>
+            认证授权用户Id
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.UserName">
+            <summary>
+            用户名
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.UserNickName">
+            <summary>
+            姓名
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.RefreshExpires">
+            <summary>
+            刷新有效期
+            </summary>
+        </member>
         <member name="T:Admin.Core.Common.Auth.IUser">
             <summary>
             用户信息接口
@@ -64,31 +94,16 @@
             昵称
             </summary>
         </member>
-        <member name="T:Admin.Core.Common.Auth.ClaimAttributes">
+        <member name="T:Admin.Core.Common.Auth.UserIdentiyServer">
             <summary>
-            Claim属性
+            用户信息
             </summary>
         </member>
-        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.UserId">
+        <member name="P:Admin.Core.Common.Auth.UserIdentiyServer.Id">
             <summary>
             用户Id
             </summary>
         </member>
-        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.UserName">
-            <summary>
-            用户名
-            </summary>
-        </member>
-        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.UserNickName">
-            <summary>
-            姓名
-            </summary>
-        </member>
-        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.RefreshExpires">
-            <summary>
-            刷新有效期
-            </summary>
-        </member>
         <member name="P:Admin.Core.Common.BaseModel.Entity`1.Id">
             <summary>
             编号
@@ -362,12 +377,12 @@
         </member>
         <member name="P:Admin.Core.Common.Configs.AppConfig.Urls">
             <summary>
-            Api地址,默认 http://*:8888
+            Api地址,默认 http://*:8000
             </summary>
         </member>
         <member name="P:Admin.Core.Common.Configs.AppConfig.CorUrls">
             <summary>
-            跨域地址,默认 http://*:9999
+            跨域地址,默认 http://*:9000
             </summary>
         </member>
         <member name="P:Admin.Core.Common.Configs.AppConfig.Swagger">
@@ -375,6 +390,11 @@
             Swagger文档
             </summary>
         </member>
+        <member name="P:Admin.Core.Common.Configs.AppConfig.IdentityServer">
+            <summary>
+            统一认证授权服务器
+            </summary>
+        </member>
         <member name="P:Admin.Core.Common.Configs.AppConfig.Aop">
             <summary>
             Aop配置
@@ -395,6 +415,21 @@
             验证码配置
             </summary>
         </member>
+        <member name="T:Admin.Core.Common.Configs.IdentityServer">
+            <summary>
+            统一认证授权服务器配置
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Common.Configs.IdentityServer.Enable">
+            <summary>
+            启用
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Common.Configs.IdentityServer.Url">
+            <summary>
+            地址
+            </summary>
+        </member>
         <member name="T:Admin.Core.Common.Configs.AopConfig">
             <summary>
             Aop配置
@@ -605,6 +640,26 @@
             文件格式
             </summary>
         </member>
+        <member name="F:Admin.Core.Common.Extensions.DateTimeExtensions.TimestampStart">
+            <summary>
+            时间戳起始日期
+            </summary>
+        </member>
+        <member name="M:Admin.Core.Common.Extensions.DateTimeExtensions.ToTimestamp(System.DateTime,System.Boolean)">
+            <summary>
+            转换为时间戳
+            </summary>
+            <param name="dateTime"></param>
+            <param name="milliseconds">是否使用毫秒</param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Common.Extensions.DateTimeExtensions.GetWeekName(System.DateTime)">
+            <summary>
+            获取周几
+            </summary>
+            <param name="datetime"></param>
+            <returns></returns>
+        </member>
         <member name="M:Admin.Core.Common.Extensions.GuidExtensions.IsNull(System.Guid)">
             <summary>
             判断Guid是否为空

+ 5 - 5
Admin.Core/Admin.Core.csproj

@@ -5,7 +5,7 @@
     <!--<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>-->
     <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
     <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
-    <Version>1.3.4</Version>
+    <Version>1.4.0</Version>
     <PackageLicenseExpression>MIT</PackageLicenseExpression>
     <Authors>xiaoxue</Authors>
     <Company>xiaoxue</Company>
@@ -44,14 +44,14 @@
     <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="6.0.0" />
     <PackageReference Include="Autofac.Extras.DynamicProxy" Version="5.0.0" />
     <PackageReference Include="Caching.CSRedis" Version="3.6.5" />
-    <PackageReference Include="FluentValidation.AspNetCore" Version="8.6.2" />
+    <PackageReference Include="FluentValidation.AspNetCore" Version="9.0.0" />
+    <PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.5" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.5" />
     <PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
-    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" />
-
-    <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.2" />
     <PackageReference Include="NLog" Version="4.7.2" />
+    <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.2" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.5.1" />
   </ItemGroup>
 
   <ItemGroup>

+ 1 - 2
Admin.Core/Admin.Core.xml

@@ -724,13 +724,12 @@
             <param name="db"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Db.ServiceCollectionExtensions.AddDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment,Admin.Core.Common.Configs.AppConfig)">
+        <member name="M:Admin.Core.Db.ServiceCollectionExtensions.AddDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment)">
             <summary>
             添加数据库
             </summary>
             <param name="services"></param>
             <param name="env"></param>
-            <param name="appConfig"></param>
         </member>
         <member name="T:Admin.Core.Enums.ApiVersion">
             <summary>

+ 4 - 6
Admin.Core/Controllers/Admin/AuthController.cs

@@ -16,6 +16,7 @@ using Admin.Core.Service.Admin.LoginLog;
 using Admin.Core.Service.Admin.LoginLog.Input;
 using Admin.Core.Common.Helpers;
 using Admin.Core.Service.Admin.User;
+using Admin.Core.Common.Extensions;
 
 namespace Admin.Core.Controllers.Admin
 {
@@ -146,8 +147,6 @@ namespace Admin.Core.Controllers.Admin
             return GetToken(output);
         }
 
-
-
         /// <summary>
         /// 刷新Token
         /// 以旧换新
@@ -164,14 +163,13 @@ namespace Admin.Core.Controllers.Admin
                 return ResponseOutput.NotOk();
             }
 
-            var refreshExpiresValue = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.RefreshExpires)?.Value;
-            if (refreshExpiresValue.IsNull())
+            var refreshExpires = userClaims.FirstOrDefault(a => a.Type == ClaimAttributes.RefreshExpires)?.Value;
+            if (refreshExpires.IsNull())
             {
                 return ResponseOutput.NotOk();
             }
 
-            var refreshExpires = refreshExpiresValue.ToDate();
-            if(refreshExpires <= DateTime.Now)
+            if(refreshExpires.ToLong() <= DateTime.Now.ToTimestamp())
             {
                 return ResponseOutput.NotOk("登录信息已过期");
             }

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Admin.Core/Db/Data/data.json


+ 2 - 2
Admin.Core/Db/DbHelper.cs

@@ -63,7 +63,7 @@ namespace Admin.Core.Db
 
             // 同步结构
             var dbType = dbConfig.Type.ToString();
-            Console.WriteLine($"\r\n{(msg.NotNull() ? msg : $"sync {dbType} structure")} started");
+            Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} started");
             if(dbConfig.Type == DataType.Oracle)
             {
                 db.CodeFirst.IsSyncStructureToUpper = true;
@@ -192,7 +192,7 @@ namespace Admin.Core.Db
                 //    Console.WriteLine($"{e.Sql}\r\n");
                 //};
 
-                Console.WriteLine("\r\nsync data started");
+                Console.WriteLine("sync data started");
 
                 db.Aop.AuditValue += SyncDataAuditValue;
                

+ 3 - 8
Admin.Core/Db/ServiceCollectionExtensions.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Threading.Tasks;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 using FreeSql;
@@ -16,8 +17,7 @@ namespace Admin.Core.Db
         /// </summary>
         /// <param name="services"></param>
         /// <param name="env"></param>
-        /// <param name="appConfig"></param>
-        public async static void AddDb(this IServiceCollection services, IHostEnvironment env, AppConfig appConfig)
+        public async static Task AddDb(this IServiceCollection services, IHostEnvironment env)
         {
             var dbConfig = new ConfigHelper().Get<DbConfig>("dbconfig", env.EnvironmentName);
 
@@ -76,10 +76,7 @@ namespace Admin.Core.Db
             {
                 fsql.Aop.CurdBefore += (s, e) =>
                 {
-                    System.Threading.Tasks.Parallel.For(0, 1, body =>
-                    {
-                        Console.WriteLine($"{e.Sql}\r\n");
-                    });
+                    Console.WriteLine($"{e.Sql}\r\n");
                 };
             }
             #endregion
@@ -129,8 +126,6 @@ namespace Admin.Core.Db
             };
             #endregion
             #endregion
-
-            Console.WriteLine($"{string.Join("\r\n", appConfig.Urls)}\r\n");
         }
     }
 }

+ 26 - 11
Admin.Core/Program.cs

@@ -2,24 +2,41 @@
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Configuration;
+using NLog;
 using NLog.Web;
 using Autofac.Extensions.DependencyInjection;
 using Admin.Core.Common.Helpers;
 using Admin.Core.Common.Configs;
 using LogLevel = Microsoft.Extensions.Logging.LogLevel;
-using Microsoft.Extensions.Configuration;
-//using NLog;
+using System.Threading.Tasks;
 //using NLog.Extensions.Logging;
-//using EnvironmentName = Microsoft.AspNetCore.Hosting.EnvironmentName;
 
 namespace Admin.Core
 {
     public class Program
     {
-        public static void Main(string[] args)
+        private static AppConfig appConfig = new ConfigHelper().Get<AppConfig>("appconfig") ?? new AppConfig();
+        public static async Task<int> Main(string[] args)
         {
-            Console.WriteLine("launching...");
-            CreateHostBuilder(args).Build().Run();
+            var logger = LogManager.GetCurrentClassLogger();
+            try
+            {
+                Console.WriteLine("launching...");
+                var host = CreateHostBuilder(args).Build();
+                Console.WriteLine($"{string.Join("\r\n", appConfig.Urls)}\r\n");
+                await host.RunAsync();
+                return 0;
+            }
+            catch (Exception ex)
+            {
+                logger.Error(ex, "Stopped program because of exception");
+                return 1;
+            }
+            finally
+            {
+                LogManager.Shutdown();
+            }
         }
 
         public static IHostBuilder CreateHostBuilder(string[] args)
@@ -28,22 +45,20 @@ namespace Admin.Core
             //var logConfig = new ConfigHelper().Load("logconfig", reloadOnChange: true).GetSection("nLog");
             //LogManager.Configuration = new NLogLoggingConfiguration(logConfig);
 
-            var appConfig = new ConfigHelper().Get<AppConfig>("appconfig") ?? new AppConfig();
-
             return Host.CreateDefaultBuilder(args)
             .UseServiceProviderFactory(new AutofacServiceProviderFactory())
             .ConfigureWebHostDefaults(webBuilder =>
             {
                 webBuilder
-                //.UseEnvironment(EnvironmentName.Production)
+                //.UseEnvironment(Environments.Production)
                 .UseStartup<Startup>()
                 .ConfigureAppConfiguration((host, config) =>
                 {
                     if (appConfig.RateLimit)
                     {
-                        config.AddJsonFile("./configs/ratelimitconfig.json", optional: true, reloadOnChange: true)
+                        config.AddJsonFile("./configs/ratelimitconfig.json", optional: false, reloadOnChange: true)
 #if DEBUG
-                        .AddJsonFile("./configs/ratelimitconfig.Development.json", false)
+                        .AddJsonFile("./configs/ratelimitconfig.Development.json", true)
 #endif
                     ;
                     }

+ 1 - 1
Admin.Core/Properties/launchSettings.json

@@ -7,7 +7,7 @@
       "environmentVariables": {
         "ASPNETCORE_ENVIRONMENT": "Development"
       },
-      "applicationUrl": "http://localhost:8888"
+      "applicationUrl": "http://localhost:8000"
     }
   }
 }

+ 124 - 65
Admin.Core/Startup.cs

@@ -35,6 +35,7 @@ using Admin.Core.Extensions;
 using Admin.Core.Common.Attributes;
 using Admin.Core.Common.Auth;
 using AspNetCoreRateLimit;
+using IdentityServer4.AccessTokenValidation;
 
 namespace Admin.Core
 {
@@ -58,10 +59,17 @@ namespace Admin.Core
         {
             //用户信息
             services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
-            services.TryAddSingleton<IUser, User>();
+            if (_appConfig.IdentityServer.Enable)
+            {
+                services.TryAddSingleton<IUser, UserIdentiyServer>();
+            }
+            else
+            {
+                services.TryAddSingleton<IUser, User>();
+            }
 
             //数据库
-            services.AddDb(_env, _appConfig);
+            services.AddDb(_env).Wait();
 
             //应用配置
             services.AddSingleton(_appConfig);
@@ -76,9 +84,9 @@ namespace Admin.Core
             #endregion
 
             #region Cors 跨域
-            services.AddCors(c =>
+            services.AddCors(options =>
             {
-                c.AddPolicy("Limit", policy =>
+                options.AddPolicy("Limit", policy =>
                 {
                     policy
                     .WithOrigins(_appConfig.CorUrls)
@@ -89,7 +97,7 @@ namespace Admin.Core
 
                 /*
                 //浏览器会发起2次请求,使用OPTIONS发起预检请求,第二次才是api异步请求
-                c.AddPolicy("All", policy =>
+                options.AddPolicy("All", policy =>
                 {
                     policy
                     .AllowAnyOrigin()
@@ -102,14 +110,62 @@ namespace Admin.Core
             });
             #endregion
 
+            #region Jwt身份认证授权
+            var jwtConfig = _configHelper.Get<JwtConfig>("jwtconfig", _env.EnvironmentName);
+            services.TryAddSingleton(jwtConfig);
+
+            if (_appConfig.IdentityServer.Enable)
+            {
+                services.AddAuthentication(options =>
+                {
+                    options.DefaultScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
+                    options.DefaultChallengeScheme = nameof(ResponseAuthenticationHandler); //401
+                    options.DefaultForbidScheme = nameof(ResponseAuthenticationHandler);    //403
+                })
+                .AddIdentityServerAuthentication(options =>
+                 {
+                     options.Authority = _appConfig.IdentityServer.Url;
+                     options.RequireHttpsMetadata = false;
+                     options.SupportedTokens = SupportedTokens.Jwt;
+                     options.ApiName = "admin.server.api";
+                     options.ApiSecret = "secret";
+                 })
+                .AddScheme<AuthenticationSchemeOptions, ResponseAuthenticationHandler>(nameof(ResponseAuthenticationHandler), o => { });
+            }
+            else
+            {
+                services.AddAuthentication(options =>
+                {
+                    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
+                    options.DefaultChallengeScheme = nameof(ResponseAuthenticationHandler); //401
+                    options.DefaultForbidScheme = nameof(ResponseAuthenticationHandler);    //403
+                })
+                .AddJwtBearer(options =>
+                {
+                    options.TokenValidationParameters = new TokenValidationParameters
+                    {
+                        ValidateIssuer = true,
+                        ValidateAudience = true,
+                        ValidateLifetime = true,
+                        ValidateIssuerSigningKey = true,
+                        ValidIssuer = jwtConfig.Issuer,
+                        ValidAudience = jwtConfig.Audience,
+                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.SecurityKey)),
+                        ClockSkew = TimeSpan.Zero
+                    };
+                })
+                .AddScheme<AuthenticationSchemeOptions, ResponseAuthenticationHandler>(nameof(ResponseAuthenticationHandler), o => { });
+            }
+            #endregion
+
             #region Swagger Api文档
             if (_env.IsDevelopment() || _appConfig.Swagger)
             {
-                services.AddSwaggerGen(c =>
+                services.AddSwaggerGen(options =>
                 {
                     typeof(ApiVersion).GetEnumNames().ToList().ForEach(version =>
                     {
-                        c.SwaggerDoc(version, new OpenApiInfo
+                        options.SwaggerDoc(version, new OpenApiInfo
                         {
                             Version = version,
                             Title = "Admin.Core"
@@ -118,75 +174,85 @@ namespace Admin.Core
                     });
 
                     var xmlPath = Path.Combine(basePath, "Admin.Core.xml");
-                    c.IncludeXmlComments(xmlPath, true);
+                    options.IncludeXmlComments(xmlPath, true);
 
                     var xmlCommonPath = Path.Combine(basePath, "Admin.Core.Common.xml");
-                    c.IncludeXmlComments(xmlCommonPath, true);
+                    options.IncludeXmlComments(xmlCommonPath, true);
 
                     var xmlModelPath = Path.Combine(basePath, "Admin.Core.Model.xml");
-                    c.IncludeXmlComments(xmlModelPath);
+                    options.IncludeXmlComments(xmlModelPath);
 
                     var xmlServicesPath = Path.Combine(basePath, "Admin.Core.Service.xml");
-                    c.IncludeXmlComments(xmlServicesPath);
+                    options.IncludeXmlComments(xmlServicesPath);
 
-                    //添加设置Token的按钮
-                    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
+                    #region 添加设置Token的按钮
+                    if (_appConfig.IdentityServer.Enable)
                     {
-                        Description = "Value: Bearer {token}",
-                        Name = "Authorization",
-                        In = ParameterLocation.Header,
-                        Type = SecuritySchemeType.ApiKey,
-                        Scheme = "Bearer"
-                    });
+                        //添加Jwt验证设置
+                        options.AddSecurityRequirement(new OpenApiSecurityRequirement()
+                        {
+                            {
+                                new OpenApiSecurityScheme
+                                {
+                                    Reference = new OpenApiReference
+                                    {
+                                        Id = "oauth2",
+                                        Type = ReferenceType.SecurityScheme
+                                    }
+                                },
+                                new List<string>()
+                            }
+                        });
 
-                    //添加Jwt验证设置
-                    c.AddSecurityRequirement(new OpenApiSecurityRequirement()
+                        //统一认证
+                        options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
+                        {
+                            Type = SecuritySchemeType.OAuth2,
+                            Description = "oauth2登录授权",
+                            Flows = new OpenApiOAuthFlows
+                            {
+                                Implicit = new OpenApiOAuthFlow
+                                {
+                                    AuthorizationUrl = new Uri($"{_appConfig.IdentityServer.Url}/connect/authorize"),
+                                    Scopes = new Dictionary<string, string>
+                                    {
+                                        { "admin.server.api", "admin后端api" }
+                                    }
+                                }
+                            }
+                        });
+                    }
+                    else
                     {
+                        //添加Jwt验证设置
+                        options.AddSecurityRequirement(new OpenApiSecurityRequirement()
                         {
-                            new OpenApiSecurityScheme
                             {
-                                Reference = new OpenApiReference
+                                new OpenApiSecurityScheme
                                 {
-                                    Type = ReferenceType.SecurityScheme,
-                                    Id = "Bearer"
+                                    Reference = new OpenApiReference
+                                    {
+                                        Id = "Bearer",
+                                        Type = ReferenceType.SecurityScheme
+                                    }
                                 },
-                                Scheme = "oauth2",
-                                Name = "Bearer",
-                                In = ParameterLocation.Header,
-                            },
-                            new List<string>()
-                        }
-                    });
+                                new List<string>()
+                            }
+                        });
+
+                        options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
+                        {
+                            Description = "Value: Bearer {token}",
+                            Name = "Authorization",
+                            In = ParameterLocation.Header,
+                            Type = SecuritySchemeType.ApiKey
+                        });
+                    } 
+                    #endregion
                 });
             }
             #endregion
 
-            #region Jwt身份认证
-            var jwtConfig = _configHelper.Get<JwtConfig>("jwtconfig", _env.EnvironmentName);
-            services.TryAddSingleton(jwtConfig);
-            services.AddAuthentication(options =>
-            {
-                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
-                options.DefaultChallengeScheme = nameof(ResponseAuthenticationHandler); //401
-                options.DefaultForbidScheme = nameof(ResponseAuthenticationHandler);    //403
-            })
-            .AddJwtBearer(options =>
-            {
-                options.TokenValidationParameters = new TokenValidationParameters
-                {
-                    ValidateIssuer = true,
-                    ValidateAudience = true,
-                    ValidateLifetime = true,
-                    ValidateIssuerSigningKey = true,
-                    ValidIssuer = jwtConfig.Issuer,
-                    ValidAudience = jwtConfig.Audience,
-                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.SecurityKey)),
-                    ClockSkew = TimeSpan.Zero
-                };
-            })
-            .AddScheme<AuthenticationSchemeOptions, ResponseAuthenticationHandler>(nameof(ResponseAuthenticationHandler), o => { }); ;
-            #endregion
-
             #region 操作日志
             if (_appConfig.Log.Operation)
             {
@@ -300,13 +366,6 @@ namespace Admin.Core
 
         public void Configure(IApplicationBuilder app)
         {
-            //启动事件 
-            //, IHostApplicationLifetime lifetime
-            //lifetime.ApplicationStarted.Register(() =>
-            //{
-            //    Console.WriteLine($"{_appConfig.Urls}\r\n");
-            //});
-
             #region app配置
             //IP限流
             if (_appConfig.RateLimit)

+ 4 - 1
Admin.Core/configs/appconfig.Development.json

@@ -1,3 +1,6 @@
 {
-
+  "IdentityServer": {
+    //µØÖ·
+    "url": "https://localhost:5000"
+  }
 }

+ 9 - 2
Admin.Core/configs/appconfig.json

@@ -1,10 +1,17 @@
 {
   //Api地址
-  "urls": [ "http://*:8888" ],
+  "urls": [ "http://*:8000" ],
   //跨域地址
-  "corUrls": [ "http://*:9999" ],
+  "corUrls": [ "http://*:9000" ],
   //Swagger文档
   "swagger": false,
+  //统一认证授权服务器
+  "IdentityServer": {
+    //启用
+    "enable": false,
+    //地址,开发认证地址前往appconfig.Development.json修改
+    "url": "https://login.zhontai.net"
+  },
   //面向切面编程
   "aop": {
     //事物

+ 10 - 8
Admin.Core/configs/dbconfig.json

@@ -4,14 +4,6 @@
   //监听Curd操作
   "curd": false,
 
-  //生成数据
-  "generateData": false,
-
-  //同步结构
-  "syncStructure": true,
-  //同步数据
-  "syncData": true,
-
   //建库
   "createDb": true,
   //SqlServer,PostgreSQL,Oracle,OdbcOracle,OdbcSqlServer,OdbcMySql,OdbcPostgreSQL,Odbc,OdbcDameng,MsAccess
@@ -26,6 +18,16 @@
   //PostgreSQL "CREATE DATABASE \"admindb\" WITH ENCODING = 'UTF8'"
   "createDbSql": "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'",
 
+  //同步结构
+  "syncStructure": true,
+  //同步数据
+  "syncData": true,
+
+  //项目初始化不开启生成数据,发布生产环境前,如果开发环境有配置数据需要更新数据包,可以开启生成数据包,使用完记得关闭
+  //开启生成数据前先关闭syncStructure syncData createDb
+  //生成数据
+  "generateData": false,
+
   //数据库配置 https://github.com/dotnetcore/FreeSql/wiki/入门
   //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11
   "type": 4,

+ 5 - 5
Admin.Core/configs/jwtconfig.json

@@ -1,12 +1,12 @@
 {
   //发行者
-  "issuer": "http://127.0.0.1:8888",
+  "issuer": "http://127.0.0.1:8000",
   //订阅者
-  "audience": "http://127.0.0.1:8888",
+  "audience": "http://127.0.0.1:8000",
   //密钥
   "securityKey": "ertJKl#521*a@790asD&1#",
-  //有效期(分钟)
+  //有效期(分钟) 120 = 2小时
   "expires": 120,
-  //刷新有效期(分钟) 10080 = 7
-  "refreshExpires": 10080
+  //刷新有效期(分钟) 1440 = 1
+  "refreshExpires": 1440
 }

+ 3 - 3
Admin.Core/configs/logconfig.json

@@ -30,19 +30,19 @@
       //调试
       "debug": {
         "type": "File",
-        "fileName": "logs/debug-${shortdate}.log",
+        "fileName": "../logs/debug-${shortdate}.log",
         "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
       },
       //警告
       "warn": {
         "type": "File",
-        "fileName": "logs/warn-${shortdate}.log",
+        "fileName": "../logs/warn-${shortdate}.log",
         "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
       },
       //错误
       "error": {
         "type": "File",
-        "fileName": "logs/error-${shortdate}.log",
+        "fileName": "../logs/error-${shortdate}.log",
         "layout": "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
       }
     },

+ 4 - 4
Admin.Core/configs/uploadconfig.json

@@ -2,7 +2,7 @@
   //头像
   "avatar": {
     //上传路径 D:/upload/admin/avatar
-    "uploadPath": "D:/upload/admin/avatar",
+    "uploadPath": "../upload/admin/avatar",
     //请求路径
     "requestPath": "/upload/admin/avatar",
 
@@ -10,7 +10,7 @@
     "dateTimeFormat": "",
     //{用户编号}
     "format": "{Id}",
-    //图片大小不超过 1M = 1024 * 1024
+    //图片大小不超过 1M = 1 * 1024 * 1024
     "maxSize": 1048576,
     //最大允许上传张数,-1不限制
     "limit": 1,
@@ -20,7 +20,7 @@
   //文档图片
   "document": {
     //上传路径 D:/upload/admin/document
-    "uploadPath": "D:/upload/admin/document",
+    "uploadPath": "../upload/admin/document",
     //请求路径
     "requestPath": "/images",
 
@@ -28,7 +28,7 @@
     "dateTimeFormat": "",
     //{文档编号}
     "format": "{Id}",
-    //图片大小不超过 10M = 1 * 1024 * 1024
+    //图片大小不超过 1M = 1 * 1024 * 1024
     "maxSize": 1048576,
     //最大允许上传张数,-1不限制
     "limit": -1,

+ 6 - 3
Admin.Core/nlog.config

@@ -7,16 +7,19 @@
   <!-- 写入日志的目标配置 archiveAboveSize="102400" maxArchiveDays="60" -->
   <targets>
     <!-- 调试  -->
-    <target xsi:type="File" name="debug" fileName="logs/debug-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
+    <target xsi:type="File" name="debug" fileName="../logs/debug-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
     <!-- 警告  -->
-    <target xsi:type="File" name="warn" fileName="logs/warn-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
+    <target xsi:type="File" name="warn" fileName="../logs/warn-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
     <!-- 错误  -->
-    <target xsi:type="File" name="error" fileName="logs/error-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
+    <target xsi:type="File" name="error" fileName="../logs/error-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
+    <!-- 控制台  -->
+    <target xsi:type="Console" name="console" layout="${message}" />
   </targets>
   <!-- 映射规则 -->
   <rules>
     <!-- 调试  -->
     <logger name="*" minlevel="Trace" maxlevel="Debug" writeTo="debug" />
+    <!--<logger name="*" minlevel="Trace" writeTo="console" />-->
     <!-- 警告  -->
     <logger name="*" minlevel="Info" maxlevel="Warn" writeTo="warn" />
     <!-- 错误  -->

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff