Browse Source

框架结构

黄贺彬 6 năm trước cách đây
mục cha
commit
1431972d0f
38 tập tin đã thay đổi với 1000 bổ sung85 xóa
  1. 21 0
      HaBookCms.Admin/Controllers/AppController.cs
  2. 57 27
      HaBookCms.Admin/Controllers/Sys/UsersController.cs
  3. 55 0
      HaBookCms.Admin/Controllers/TokenController.cs
  4. 1 1
      HaBookCms.Admin/HaBookCms.Admin.csproj
  5. 19 0
      HaBookCms.Admin/Models/TicketInfo.cs
  6. 7 6
      HaBookCms.Admin/Startup.cs
  7. 10 4
      HaBookCms.Admin/appsettings.json
  8. 40 0
      HaBookCms.Common/CryptHelper/Md5Crypt.cs
  9. 5 0
      HaBookCms.ContextConfig/Exceptions/ExceptionFilter.cs
  10. 0 8
      HaBookCms.Core/Class1.cs
  11. 0 1
      HaBookCms.Core/HaBookCms.Core.csproj
  12. 78 0
      HaBookCms.Core/Models/System/SysOrg.cs
  13. 49 0
      HaBookCms.Core/Models/System/SysOrgRole.cs
  14. 57 0
      HaBookCms.Core/Models/System/SysOrgRoleUser.cs
  15. 70 0
      HaBookCms.Core/Models/System/SysPmsn.cs
  16. 69 0
      HaBookCms.Core/Models/System/SysRole.cs
  17. 46 0
      HaBookCms.Core/Models/System/SysRolePmsn.cs
  18. 25 0
      HaBookCms.Core/Models/System/SysUser.cs
  19. 0 8
      HaBookCms.Extensions/Class1.cs
  20. 2 2
      HaBookCms.Extensions/Jwt/JwtAuthorizationFilter.cs
  21. 4 3
      HaBookCms.Extensions/Jwt/JwtHelper.cs
  22. 0 0
      HaBookCms.Jwt/HaBookCms.Jwt.csproj
  23. 1 1
      HaBookCms.Extensions/Jwt/Model/BaseConfigModel.cs
  24. 1 1
      HaBookCms.Extensions/Jwt/Model/JwtAuthConfigModel.cs
  25. 1 1
      HaBookCms.Extensions/Jwt/Model/JwtToken.cs
  26. 1 1
      HaBookCms.Extensions/Jwt/Model/Permission.cs
  27. 1 1
      HaBookCms.Extensions/Jwt/Model/PermissionRequirement.cs
  28. 1 1
      HaBookCms.Extensions/Jwt/Model/TokenModel.cs
  29. 48 0
      HaBookCms.Response/BaseResponse.cs
  30. 25 0
      HaBookCms.Response/DataResponse.cs
  31. 25 0
      HaBookCms.Response/DatasResponse.cs
  32. 7 0
      HaBookCms.Response/HaBookCms.Response.csproj
  33. 25 0
      HaBookCms.Response/PageDatasResponse.cs
  34. 66 0
      HaBookCms.Response/PageResponse.cs
  35. 142 0
      HaBookCms.Response/ResponseBuilder.cs
  36. 23 0
      HaBookCms.Response/TimeStampResponse.cs
  37. 0 8
      HaBookCms.Service/Class1.cs
  38. 18 11
      HaBookCms.sln

+ 21 - 0
HaBookCms.Admin/Controllers/AppController.cs

@@ -0,0 +1,21 @@
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace HaBookCms.Admin.Controllers
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    [Authorize(Roles = "App")]
+    public class AppController : ControllerBase
+    {
+        [HttpGet]
+        [Route("test")]
+        public string Test()
+        {
+            return "App";
+        }
+    }
+}

+ 57 - 27
HaBookCms.Admin/Controllers/Sys/UsersController.cs

@@ -1,8 +1,14 @@
-using Microsoft.AspNetCore.Authorization;
+using HaBookCms.Admin.Models;
+using HaBookCms.Common.CryptHelper;
+using HaBookCms.Jwt.Model;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Cors;
 using Microsoft.AspNetCore.Mvc;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Security.Claims;
 using System.Threading.Tasks;
 
 namespace HaBookCms.Admin.Controllers.Sys
@@ -13,40 +19,64 @@ namespace HaBookCms.Admin.Controllers.Sys
     [Authorize(Policy = "RequireAdmin")]
     [Produces("application/json")]
     [Route("api/Users")]
-    public class UsersController :Controller
-    {   // GET: api/Blog/5
+    public class UsersController : Controller
+    {
+        PermissionRequirement _requirement;
         /// <summary>
-        /// 获取详情
+        /// 获取JWT的方法 3.0
         /// </summary>
-        /// <param name="id"></param>
+        /// <param name="name"></param>
+        /// <param name="pass"></param>
         /// <returns></returns>
-        [HttpGet("ccc")]
-        public async Task<object> Get(int id)
+        [HttpPost]
+        [Route("checkLogin")]
+        [EnableCors("any")]
+        [AllowAnonymous]
+        public async Task<object> checkLogin(TicketInfo ticketInfo)
         {
 
-            Console.WriteLine("11");
-            return Ok(new
+           
+            string jwtStr = string.Empty;
+            bool suc = false;
+
+            //  var user = await sysUserInfoServices.GetUserRoleNameStr(name, pass);
+            var user = "aaa";
+            if (user != null)
             {
-                success = true,
-                data = "aaa"
-            });
-        }
-        // GET: api/Blog/5
-        /// <summary>
-        /// 获取详情
-        /// </summary>
-        /// <param name="id"></param>
-        /// <returns></returns>
-        [HttpGet("checkLogin")]
-        [AllowAnonymous]
-        public async Task<object> checkLogin()
-        {
+                //如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色
+                var claims = new List<Claim> {
+                    new Claim(ClaimTypes.Name, ticketInfo.teamModelId),
+                    new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) };
+                claims.AddRange(user.Split(',').Select(s => new Claim(ClaimTypes.Role, s)));
+
+                //用户标识
+                var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
+                identity.AddClaims(claims);
 
-            return Ok(new
+                var token = JwtToken.BuildJwtToken(claims.ToArray(), _requirement);
+                return new JsonResult(token);
+            }
+            else
             {
-                success = true,
-                data = "bbb"
-            });
+                return new JsonResult(new
+                {
+                    Status = false,
+                    Message = "认证失败"
+                });
+            }
+        }
+
+       private int  CheckTicketInfo(TicketInfo ticketInfo) {
+            if (ticketInfo != null 
+                &&!string.IsNullOrEmpty(ticketInfo.sign) 
+                && !string.IsNullOrEmpty(ticketInfo.ticket)
+                && !string.IsNullOrEmpty(ticketInfo.teamModelId)){
+                string md5info = Md5Crypt.GetMd5String(ticketInfo.ticket);
+                if (md5info.Equals(ticketInfo.sign))
+                {
+                }
+            }
+            return 0;
         }
     }
 }

+ 55 - 0
HaBookCms.Admin/Controllers/TokenController.cs

@@ -0,0 +1,55 @@
+using HaBookCms.Jwt.Filter;
+using HaBookCms.Jwt.Model;
+using Microsoft.AspNetCore.Cors;
+using Microsoft.AspNetCore.Mvc;
+using System;
+namespace HaBookCms.Admin.Controllers
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    [EnableCors("Any")]
+    public class TokenController : Controller
+    {
+        #region Token
+        /// <summary>
+        /// 模拟登录,获取JWT
+        /// </summary>
+        /// <param name="tm"></param>
+        /// <returns></returns>
+        [HttpGet]
+        [Route("getAdmin")]
+        public JsonResult GetJWTAdmin()
+        {
+            var tm = new TokenModel()
+            {
+                Uid = Guid.NewGuid().ToString(),
+                Role = "Admin",
+                Project = "Manage",
+                TokenType = "Web"
+            };
+            return Json(JwtHelper.IssueJWT(tm));
+        }
+        #endregion
+
+        #region Token
+        /// <summary>
+        /// 模拟登录,获取JWT
+        /// </summary>
+        /// <param name="tm"></param>
+        /// <returns></returns>
+        [HttpGet]
+        [Route("getApp")]
+        public JsonResult GetJWTApp()
+        {
+            var tm = new TokenModel()
+            {
+                Uid = Guid.NewGuid().ToString(),
+                Role = "App",
+                Project = "APp",
+                TokenType = "App"
+            };
+            return Json(JwtHelper.IssueJWT(tm));
+        }
+        #endregion
+    }
+}

+ 1 - 1
HaBookCms.Admin/HaBookCms.Admin.csproj

@@ -16,7 +16,7 @@
   <ItemGroup>
     <ProjectReference Include="..\HaBookCms.Common\HaBookCms.Common.csproj" />
     <ProjectReference Include="..\HaBookCms.ContextConfig\HaBookCms.ContextConfig.csproj" />
-    <ProjectReference Include="..\HaBookCms.Extensions\HaBookCms.Extensions.csproj" />
+    <ProjectReference Include="..\HaBookCms.Jwt\HaBookCms.Jwt.csproj" />
     <ProjectReference Include="..\HaBookCms.RedisStorage\HaBookCms.RedisStorage.csproj" />
   </ItemGroup>
 

+ 19 - 0
HaBookCms.Admin/Models/TicketInfo.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace HaBookCms.Admin.Models
+{
+
+    /// <summary>
+    /// 前端返回获取的醍摩豆ID登录基本信息及ticket
+    /// </summary>
+    public class TicketInfo
+    {
+        public String ticket { get; set; }
+        public String name { get; set; }
+        public String sign { get; set; }
+        public String teamModelId { get; set; }
+    }
+}

+ 7 - 6
HaBookCms.Admin/Startup.cs

@@ -7,8 +7,8 @@ using System.Text.Encodings.Web;
 using System.Text.Unicode;
 using HaBookCms.Common.LogHelper;
 using HaBookCms.ContextConfig.Exceptions;
-using HaBookCms.Extensions.Jwt;
-using HaBookCms.Extensions.Jwt.Model;
+using HaBookCms.Jwt.Filter;
+using HaBookCms.Jwt.Model;
 using HaBookCms.RedisStorage.Cache;
 using log4net;
 using log4net.Config;
@@ -67,11 +67,12 @@ namespace HaBookCms.Admin
             services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
             #region 认证
             JwtAuthConfigModel jwtConfig = new JwtAuthConfigModel();
-            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
+            // services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
             //.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
             // {
             //     o.LoginPath = new PathString("/api/Users/checkLogin");
             // })
+            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
              .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o =>
              {
                
@@ -108,8 +109,8 @@ namespace HaBookCms.Admin
                 "/api/denied",// 拒绝授权的跳转地址(目前无用)
                 permission,
                 ClaimTypes.Role,//基于角色的授权
-               jwtConfig.Issuer,//发行人
-               jwtConfig.Audience,//听众
+                jwtConfig.Issuer,//发行人
+                jwtConfig.Audience,//听众
                 signingCredentials,//签名凭据
                 expiration: TimeSpan.FromSeconds(60 * 2)//接口的过期时间
                 );
@@ -169,7 +170,7 @@ namespace HaBookCms.Admin
                 c.AddPolicy("Limit", policy =>
                 {
                     policy
-                    .WithOrigins("localhost:4909")
+                    .WithOrigins("localhost:63969")
                     .WithMethods("get", "post", "put", "delete")
                     //.WithHeaders("Authorization");
                     .AllowAnyHeader();

+ 10 - 4
HaBookCms.Admin/appsettings.json

@@ -21,14 +21,12 @@
         "AccountEndpoint": "https://teammodelostest.documents.azure.cn:443/",
         "AccountKey": "ReGoiHuTbU4Q31YYq4NaiormE6Ci71piT7OrvTzAuhrlgt63ajdtDZmwOZKzcz6gnwR326mJp53InY7rohepQQ=="
       }
-    },
-    "Date": "2018-08-28",
-    "Author": "Blog.Core"
+    }
   },
   "JwtAuth": {
     "SecurityKey": "b0a364cd88a7612870bb1d5f51712d43",
     "Issuer": "HaBook.Cms.Admin",
-    "Audience": "wr",
+    "Audience": "HaBook",
     "WebExp": 12,
     "AppExp": 1440,
     "MiniProgramExp": 1440,
@@ -36,5 +34,13 @@
   },
   "Cache": {
     "IsUseRedis": true
+  },
+  "HaBookSecurityKey": {
+    "UserInfoKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
+    "SubmissionKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJTdWJtaXNzaW9uIiwiYXVkIjoiY2hlbmdkdVN1Ym1pc3Npb24iLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTQwODgxMDUwLCJuYmYiOjE1NDA4ODEwNTAsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.4SpRSfKwkbLWvsi87L5AjIVC5MZGMfon6SbjwNC0AfA",
+    "SchoolCodeKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzY2hvb2xDb2RlIiwiYXVkIjoiY2hlbmdkdVNjaG9vbENvZGUiLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTM2MDUyNDI3LCJuYmYiOjE1MzYwNTI0MjcsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.8m5VH3Nz4N9EdMz8AexTOEuDVitcJZFKy9DfW_UQkSY",
+    "BindingIESKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpZCIsImF1ZCI6ImNoZW5nZHVJZCIsImlzcyI6Imh0dHBzOi8vYXBpLmhhYm9va2FjbGFzcy5iaXoiLCJpYXQiOjE1MzYwNTIzNjcsIm5iZiI6MTUzNjA1MjM2NywiZXhwIjoxNTY3NTU1MjAwLCJpZHAiOiJIYWJvb2sgQ29yZVNlcnZpY2UifQ.RGKDVtwFEp4OBctlHOuF6yqyI21fTz4cinCxjFCxkSQ",
+    "CreateTestSerialNumKey": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJDcmVhdGVUZXN0U2VyaWFsIiwiYXVkIjoiY2hlbmdkdUNyZWF0ZVRlc3RTZXJpYWwiLCJpc3MiOiJodHRwczovL2FwaS5oYWJvb2thY2xhc3MuYml6IiwiaWF0IjoxNTM5NjgwMjUxLCJuYmYiOjE1Mzk2ODAyNTEsImV4cCI6MTU2NzU1NTIwMCwiaWRwIjoiSGFib29rIENvcmVTZXJ2aWNlIn0.K-4rqcJ8O2mFxIdSiSJTuvo_Nwb_NfZ1yjpXJFQjKM0",
+    "SmsKey": "Basic ZmYwMWM0YTJjODdmZmNkYTUyNjhmMDEwOmE0YTE5YTVjNTU2ZWVhZTNjZmZhNTI0Mg=="
   }
 }

+ 40 - 0
HaBookCms.Common/CryptHelper/Md5Crypt.cs

@@ -1,4 +1,5 @@
 using System;
+using System.IO;
 using System.Security.Cryptography;
 using System.Text;
 
@@ -45,5 +46,44 @@ namespace HaBookCms.Common.CryptHelper
                 ret += result[i].ToString("x").PadLeft(2, '0');
             return ret;
         }
+
+        public static string GetMd5String(string str)
+        {
+            MD5 md5 = MD5.Create();
+            byte[] data = Encoding.UTF8.GetBytes(str);
+            byte[] enData = md5.ComputeHash(data);
+            return GetbyteToString(enData);
+        }
+
+        public static string GetMD5String(string str, HashAlgorithm hash)
+        {
+
+            byte[] data = Encoding.UTF8.GetBytes(str);
+            byte[] data2 = hash.ComputeHash(data);
+            return GetbyteToString(data2);
+        }
+
+        public static string GetMD5FromFile(string path)
+        {
+            MD5 md5 = MD5.Create();
+            if (!File.Exists(path))
+            {
+                return "";
+            }
+            FileStream stream = File.OpenRead(path);
+            byte[] data2 = md5.ComputeHash(stream);
+
+            return GetbyteToString(data2);
+            //return BitConverter.ToString(data2).Replace("-", "").ToLower();
+        }
+        private static string GetbyteToString(byte[] data)
+        {
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < data.Length; i++)
+            {
+                sb.Append(data[i].ToString("x2"));
+            }
+            return sb.ToString();
+        }
     }
 }

+ 5 - 0
HaBookCms.ContextConfig/Exceptions/ExceptionFilter.cs

@@ -25,6 +25,7 @@ namespace HaBookCms.ContextConfig.Exceptions
         /// <returns></returns>
         public async Task Invoke(HttpContext context)
         {
+            Exception exs = null;
             bool isCatched = false;
             try
             {
@@ -32,6 +33,7 @@ namespace HaBookCms.ContextConfig.Exceptions
             }
             catch (Exception ex) //发生异常
             {
+                exs = ex;
                 //自定义业务异常
                 if (ex is BizException)
                 {
@@ -62,6 +64,9 @@ namespace HaBookCms.ContextConfig.Exceptions
                         case 502:
                             msg = "请求错误";
                             break;
+                        case 500:
+                            msg = exs.Message;
+                            break;
                         default:
                             msg = "未知错误";
                             break;

+ 0 - 8
HaBookCms.Core/Class1.cs

@@ -1,8 +0,0 @@
-using System;
-
-namespace HaBookCms.Core
-{
-    public class Class1
-    {
-    }
-}

+ 0 - 1
HaBookCms.Core/HaBookCms.Core.csproj

@@ -6,7 +6,6 @@
 
   <ItemGroup>
     <Folder Include="Models\Contest\" />
-    <Folder Include="Models\System\" />
     <Folder Include="Models\Website\" />
   </ItemGroup>
 

+ 78 - 0
HaBookCms.Core/Models/System/SysOrg.cs

@@ -0,0 +1,78 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Core.Models.System
+{
+    /// <summary>
+    /// 组织机构
+    /// </summary>
+    public class SysOrg
+    {
+        public SysOrg()
+        {
+        }
+        /// <summary>
+        /// Desc:唯一编号
+        /// Default:
+        /// Nullable:False
+        /// </summary>           
+        public string Guid { get; set; }
+        /// <summary>
+        /// Desc:父节点
+        /// Default:
+        /// Nullable:True
+        /// </summary>           
+        public string ParentGuid { get; set; }
+        /// <summary>
+        /// Desc:组织名称
+        /// Default:
+        /// Nullable:False
+        /// </summary>           
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Desc:父节名称
+        /// Default:
+        /// Nullable:True
+        /// </summary>           
+        public string ParentName { get; set; }
+
+        /// <summary>
+        /// Desc:层级
+        /// Default:0
+        /// Nullable:False
+        /// </summary>           
+        public int Level { get; set; }
+
+        /// <summary>
+        /// Desc:排序
+        /// Default:
+        /// Nullable:True
+        /// </summary>           
+        public int Sort { get; set; } = 1;
+
+        /// <summary>
+        /// Desc:状态
+        /// Default:b'0'
+        /// Nullable:False
+        /// </summary>           
+        public int Status { get; set; }
+        
+        /// <summary>
+        /// 创建ID
+        /// </summary>
+        public string CreateTeamModelId { get; set; }
+       
+        /// <summary>
+        /// 创建者
+        /// </summary>
+        public string CreateNickName { get; set; }
+        
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public long CreateTime { get; set; }
+
+    }
+}

+ 49 - 0
HaBookCms.Core/Models/System/SysOrgRole.cs

@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Core.Models.System
+{
+    /// <summary>
+    /// 组织机构包含的角色
+    /// </summary>
+    public class SysOrgRole
+    {
+        /// <summary>
+        /// 主键ID 组织机构-角色
+        /// </summary>
+        public string GuidOR { get; set;  }
+        /// <summary>
+        /// 角色ID
+        /// </summary>
+        public string RoleGuid { get; set;  }
+        /// <summary>
+        /// 组织机构ID
+        /// </summary>
+        public string OrgGuid { get; set; }
+        /// <summary>
+        /// Desc:排序
+        /// Default:
+        /// Nullable:True
+        /// </summary>           
+        public int Sort { get; set; } = 1;
+        /// <summary>
+        /// Desc:状态
+        /// Default:b'0'
+        /// Nullable:False
+        /// </summary>           
+        public int Status { get; set; }
+        /// <summary>
+        /// 创建ID
+        /// </summary>
+        public string CreateTeamModelId { get; set; }
+        /// <summary>
+        /// 创建者
+        /// </summary>
+        public string CreateNickName { get; set; }
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public long CreateTime { get; set; }
+    }
+}

+ 57 - 0
HaBookCms.Core/Models/System/SysOrgRoleUser.cs

@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Core.Models.System
+{
+    /// <summary>
+    /// 组织机构下角色的用户
+    /// </summary>
+    public class SysOrgRoleUser
+    {
+        /// <summary>
+        /// 主键ID 组织机构-角色-用户
+        /// </summary>
+        public string GuidORU { get; set; }
+        /// <summary>
+        /// 组织机构-角色ID
+        /// </summary>
+        public string GuidOR { get; set; }
+        /// <summary>
+        /// 角色ID
+        /// </summary>
+        public string RoleGuid { get; set; }
+        /// <summary>
+        /// 组织机构ID
+        /// </summary>
+        public string OrgGuid { get; set; }
+        /// <summary>
+        /// 用户ID
+        /// </summary>
+        public string UserGuid { get; set; }
+        /// <summary>
+        /// Desc:排序
+        /// Default:
+        /// Nullable:True
+        /// </summary>           
+        public int Sort { get; set; } = 1;
+        /// <summary>
+        /// Desc:状态
+        /// Default:b'0'
+        /// Nullable:False
+        /// </summary>           
+        public int Status { get; set; }
+        /// <summary>
+        /// 创建ID
+        /// </summary>
+        public string CreateTeamModelId { get; set; }
+        /// <summary>
+        /// 创建者
+        /// </summary>
+        public string CreateNickName { get; set; }
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public long CreateTime { get; set; }
+    }
+}

+ 70 - 0
HaBookCms.Core/Models/System/SysPmsn.cs

@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Core.Models.System
+{
+    public class SysPmsn
+    {
+        /// <summary>
+        /// 主键ID
+        /// </summary>
+        public string Guid { get; set; }
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public string Name { get; set; }
+        /// <summary>
+        /// 权限代码
+        /// </summary>
+        public string Code { get; set; }
+        /// <summary>
+        /// 1模块,2菜单,3按钮,4链接
+        /// </summary>
+        public string Type { get; set; }
+        /// <summary>
+        /// 图标
+        /// </summary>
+        public string Icon { get; set; }
+        /// <summary>
+        /// 链接地址
+        /// </summary>
+        public string Url { get; set; }
+        /// <summary>
+        /// 等级
+        /// </summary>
+        public int Level { get; set; }
+        /// <summary>
+        /// 排序字段
+        /// </summary>
+        public int Sort { get; set; }
+        /// <summary>
+        /// 状态
+        /// </summary>
+        public int Status { get; set; }
+        /// <summary>
+        /// 上级ID
+        /// </summary>
+        public string ParentGuid { get; set; }
+        /// <summary>
+        /// 上级名称
+        /// </summary>
+        public string ParentName { get; set; }
+        /// <summary>
+        /// 描述
+        /// </summary>
+        public string Description { get; set; }
+        /// <summary>
+        /// 创建ID
+        /// </summary>
+        public string CreateTeamModelId { get; set; }
+        /// <summary>
+        /// 创建者
+        /// </summary>
+        public string CreateNickName { get; set; }
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public long CreateTime { get; set; }
+    }
+}

+ 69 - 0
HaBookCms.Core/Models/System/SysRole.cs

@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Core.Models.System
+{
+    /// <summary>
+    /// 系统角色信息
+    /// </summary>
+    public class SysRole
+    {
+        public SysRole()
+        {
+        }
+        public SysRole(string name)
+        {
+            Name = name;
+            Description = "";
+            Sort = 1;
+            Status = 1;
+            CreateTime = DateTime.Now.Ticks;
+        }
+        /// <summary>
+        /// 是否超级管理员
+        /// </summary>           
+        public bool IsSystem { get; set; }
+        /// <summary>
+        /// 角色编号
+        /// </summary>           
+        public string Code { get; set; }
+        /// <summary>
+        /// ID
+        /// </summary>           
+        public string Guid { get; set; }
+        /// <summary>
+        ///获取或设置是否禁用,逻辑上的删除,非物理删除
+        /// </summary>
+        public int  Status { get; set; }
+        /// <summary>
+        /// 角色名
+        /// </summary>
+        public string Name { get; set; }
+        /// <summary>
+        /// 角色标题
+        /// </summary>
+        public string Title { get; set; }
+        /// <summary>
+        ///描述
+        /// </summary>
+        public string Description { get; set; }
+        /// <summary>
+        ///排序
+        /// </summary>
+        public int Sort { get; set; }
+        /// <summary>
+        /// 创建ID
+        /// </summary>
+        public string CreateTeamModelId { get; set; }
+        /// <summary>
+        /// 创建者
+        /// </summary>
+        public string CreateNickName { get; set; }
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public long CreateTime { get; set; }
+       
+    }
+}

+ 46 - 0
HaBookCms.Core/Models/System/SysRolePmsn.cs

@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Core.Models.System
+{
+    public class SysRolePmsn
+    {
+        /// <summary>
+        /// 主键ID 角色-权限
+        /// </summary>
+        public string GuidRP { get; set;  }
+        /// <summary>
+        /// 角色ID
+        /// </summary>
+        public string RoleGuid { get; set; }
+        /// <summary>
+        /// 权限ID
+        /// </summary>
+        public string PmsnGuid { get; set; }
+        /// <summary>
+        /// Desc:排序
+        /// Default:
+        /// Nullable:True
+        /// </summary>           
+        public int Sort { get; set; } = 1;
+        /// <summary>
+        /// Desc:状态
+        /// Default:b'0'
+        /// Nullable:False
+        /// </summary>           
+        public int Status { get; set; }
+        /// <summary>
+        /// 创建ID
+        /// </summary>
+        public string CreateTeamModelId { get; set; }
+        /// <summary>
+        /// 创建者
+        /// </summary>
+        public string CreateNickName { get; set; }
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public long CreateTime { get; set; }
+    }
+}

+ 25 - 0
HaBookCms.Core/Models/System/SysUser.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Core.Models.System
+{
+    /// <summary>
+    /// 系统用户
+    /// </summary>
+    public class SysUser
+    {
+        public string Guid { get; set; }
+        public string UserName { get; set; }
+        public string NickName { get; set; }
+        public string Sex { get; set; }
+        public string Phone { get; set; }
+        public string Email { get; set; }
+        public string TeamModelId { get; set; }
+        public string Header { get; set; }
+        public string City { get; set; }
+        public string CityCode { get; set; }
+        public long  RegisterTime { get; set; }
+        public string CountryCode { get; set; }
+    }
+}

+ 0 - 8
HaBookCms.Extensions/Class1.cs

@@ -1,8 +0,0 @@
-using System;
-
-namespace HaBookCms.Extensions
-{
-    public class Class1
-    {
-    }
-}

+ 2 - 2
HaBookCms.Extensions/Jwt/JwtAuthorizationFilter.cs

@@ -1,4 +1,4 @@
-using HaBookCms.Extensions.Jwt.Model;
+using HaBookCms.Jwt.Model;
 using Microsoft.AspNetCore.Http;
 using System;
 using System.Collections.Generic;
@@ -6,7 +6,7 @@ using System.Security.Claims;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace HaBookCms.Extensions.Jwt
+namespace HaBookCms.Jwt.Filter
 {
     /// <summary>
     /// 授权中间件

+ 4 - 3
HaBookCms.Extensions/Jwt/JwtHelper.cs

@@ -1,4 +1,4 @@
-using HaBookCms.Extensions.Jwt.Model;
+using HaBookCms.Jwt.Model;
 using Microsoft.IdentityModel.Tokens;
 using System;
 using System.Collections.Generic;
@@ -6,7 +6,7 @@ using System.IdentityModel.Tokens.Jwt;
 using System.Security.Claims;
 using System.Text;
 
-namespace HaBookCms.Extensions.Jwt
+namespace HaBookCms.Jwt.Filter
 {
     public class JwtHelper
     {
@@ -47,7 +47,8 @@ namespace HaBookCms.Extensions.Jwt
                     break;
             }
             var jwt = new JwtSecurityToken(
-                issuer: "FytSoa",
+               //  issuer: "FytSoa",
+                issuer: BaseConfigModel.Configuration["JwtAuth:Issuer"],
                 claims: claims, //声明集合
                 expires: dateTime.AddHours(exp),
                 signingCredentials: creds);

HaBookCms.Extensions/HaBookCms.Extensions.csproj → HaBookCms.Jwt/HaBookCms.Jwt.csproj


+ 1 - 1
HaBookCms.Extensions/Jwt/Model/BaseConfigModel.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 using Microsoft.Extensions.Configuration;
-namespace HaBookCms.Extensions.Jwt.Model
+namespace HaBookCms.Jwt.Model
 {
    public class BaseConfigModel
     {/// <summary>

+ 1 - 1
HaBookCms.Extensions/Jwt/Model/JwtAuthConfigModel.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HaBookCms.Extensions.Jwt.Model
+namespace HaBookCms.Jwt.Model
 {
     public class JwtAuthConfigModel : BaseConfigModel
     {

+ 1 - 1
HaBookCms.Extensions/Jwt/Model/JwtToken.cs

@@ -4,7 +4,7 @@ using System.IdentityModel.Tokens.Jwt;
 using System.Security.Claims;
 using System.Text;
 
-namespace HaBookCms.Extensions.Jwt.Model
+namespace HaBookCms.Jwt.Model
 {
     /// <summary>
     /// JWTToken生成类

+ 1 - 1
HaBookCms.Extensions/Jwt/Model/Permission.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HaBookCms.Extensions.Jwt.Model
+namespace HaBookCms.Jwt.Model
 {
     /// <summary>
     /// 用户或角色或其他凭据实体

+ 1 - 1
HaBookCms.Extensions/Jwt/Model/PermissionRequirement.cs

@@ -4,7 +4,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace HaBookCms.Extensions.Jwt.Model
+namespace HaBookCms.Jwt.Model
 {
 
     /// <summary>

+ 1 - 1
HaBookCms.Extensions/Jwt/Model/TokenModel.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HaBookCms.Extensions.Jwt.Model
+namespace HaBookCms.Jwt.Model
 {
     /// <summary>
     /// 令牌

+ 48 - 0
HaBookCms.Response/BaseResponse.cs

@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Response
+{
+    public class BaseResponse : TimeStampResponse
+    {
+        public Dictionary<String, Object> extend;
+        public String message = "success";
+        public int code;
+
+
+        public BaseResponse()
+        {
+        }
+
+        public String getMessage()
+        {
+            return this.message;
+        }
+
+        public void setMessage(String message)
+        {
+            this.message = message;
+        }
+
+        public int getCode()
+        {
+            return this.code;
+        }
+
+        public Dictionary<String, Object> getExtend()
+        {
+            return this.extend;
+        }
+
+        public void setExtend(Dictionary<String, Object> extend)
+        {
+            this.extend = extend;
+        }
+
+        public void setCode(int code)
+        {
+            this.code = code;
+        }
+    }
+}

+ 25 - 0
HaBookCms.Response/DataResponse.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Response
+{
+    public class DataResponse<T> : BaseResponse
+    {
+        public T data;
+
+        public DataResponse()
+        {
+        }
+
+        public T getData()
+        {
+            return this.data;
+        }
+
+        public void setData(T data)
+        {
+            this.data = data;
+        }
+    }
+}

+ 25 - 0
HaBookCms.Response/DatasResponse.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Response
+{
+    public class DatasResponse<T> : BaseResponse
+    {
+        public IList<T> datas;
+
+        public DatasResponse()
+        {
+        }
+
+        public IList<T> getDatas()
+        {
+            return this.datas;
+        }
+
+        public void setDatas(IList<T> datas)
+        {
+            this.datas = datas;
+        }
+    }
+}

+ 7 - 0
HaBookCms.Response/HaBookCms.Response.csproj

@@ -0,0 +1,7 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.2</TargetFramework>
+  </PropertyGroup>
+
+</Project>

+ 25 - 0
HaBookCms.Response/PageDatasResponse.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Response
+{
+    public class PageDatasResponse<T> : DatasResponse<T>
+    {
+        public PageResponse page;
+
+        public PageDatasResponse()
+        {
+        }
+
+        public PageResponse getPage()
+        {
+            return this.page;
+        }
+
+        public void setPage(PageResponse page)
+        {
+            this.page = page;
+        }
+    }
+}

+ 66 - 0
HaBookCms.Response/PageResponse.cs

@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Response
+{
+    public class PageResponse
+    {
+        public long total;
+        public int currPage;
+        public int pageSize;
+        public int totalPage;
+
+        public long getTotal()
+        {
+            return this.total;
+        }
+
+        public void setTotal(long total)
+        {
+            this.total = total;
+        }
+
+        public int getCurrPage()
+        {
+            return this.currPage;
+        }
+
+        public void setCurrPage(int currPage)
+        {
+            this.currPage = currPage;
+        }
+
+        public int getPageSize()
+        {
+            return this.pageSize;
+        }
+
+        public void setPageSize(int pageSize)
+        {
+            this.pageSize = pageSize;
+        }
+
+        public int getTotalPage()
+        {
+            return this.totalPage;
+        }
+
+        public void setTotalPage(int totalPage)
+        {
+            this.totalPage = totalPage;
+        }
+
+        public PageResponse()
+        {
+        }
+
+        public PageResponse(long total, int currPage, int pageSize, int totalPage)
+        {
+            this.total = total;
+            this.currPage = currPage;
+            this.pageSize = pageSize;
+            this.totalPage = totalPage;
+        }
+    }
+}

+ 142 - 0
HaBookCms.Response/ResponseBuilder.cs

@@ -0,0 +1,142 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Response
+{
+    public class ResponseBuilder
+    {
+        private String message = "success";
+        private Object data;
+        private int code = 0;
+        private IList<Object> datas;
+        private int total;
+        private int currPage;
+        private int pageSize;
+        private int totalPage;
+        private Dictionary<String, Object> extend;
+
+        private ResponseBuilder()
+        {
+        }
+
+        public static ResponseBuilder custom()
+        {
+            return new ResponseBuilder();
+        }
+
+        public BaseResponse build()
+        {
+            if (this.total > 0 && this.pageSize > 0 && this.totalPage <= 0)
+            {
+                this.totalPage = (int)Math.Ceiling((double)this.total / (double)this.pageSize);
+            }
+            Object baseResponse;
+            if (null != this.datas && this.total > 0 && this.currPage > 0 && this.pageSize > 0 && this.totalPage > 0)
+            {
+                PageDatasResponse<Object> pageDatasResponse = new PageDatasResponse<Object>();
+                pageDatasResponse.setCode(this.code);
+                pageDatasResponse.setDatas(this.datas);
+                pageDatasResponse.setMessage(this.message);
+                pageDatasResponse.setPage(new PageResponse((long)this.total, this.currPage, this.pageSize, this.totalPage));
+                pageDatasResponse.setExtend(this.extend);
+                baseResponse = pageDatasResponse;
+            }
+            else if (this.datas != null)
+            {
+                DatasResponse<Object> datasResponse = new DatasResponse<Object>();
+                datasResponse.setCode(this.code);
+                datasResponse.setDatas(this.datas);
+                datasResponse.setMessage(this.message);
+                datasResponse.setExtend(this.extend);
+                baseResponse = datasResponse;
+            }
+            else if (this.data != null)
+            {
+                DataResponse<Object> dataResponse = new DataResponse<Object>();
+                dataResponse.setData(this.data);
+                dataResponse.setCode(this.code);
+                dataResponse.setMessage(this.message);
+                dataResponse.setExtend(this.extend);
+                baseResponse = dataResponse;
+            }
+            else
+            {
+                baseResponse = new BaseResponse();
+                ((BaseResponse)baseResponse).setMessage(this.message);
+                ((BaseResponse)baseResponse).setCode(this.code);
+                ((BaseResponse)baseResponse).setExtend(this.extend);
+            }
+
+            return (BaseResponse)baseResponse;
+        }
+
+        public ResponseBuilder Extend(Dictionary<String, Object> extend)
+        {
+            this.extend = extend;
+            return this;
+        }
+
+        public ResponseBuilder Data(Object data)
+        {
+            this.data = data;
+            return this;
+        }
+
+        public ResponseBuilder totalCount(int totalCount)
+        {
+            this.total = totalCount;
+            return this;
+        }
+
+        public ResponseBuilder CurrPage(int currPage)
+        {
+            this.currPage = currPage;
+            return this;
+        }
+
+        public ResponseBuilder PageSize(int pageSize)
+        {
+            this.pageSize = pageSize;
+            return this;
+        }
+
+        public ResponseBuilder TotalPage(int totalPage)
+        {
+            this.totalPage = totalPage;
+            return this;
+        }
+
+        public ResponseBuilder success()
+        {
+            return this;
+        }
+
+        public ResponseBuilder success(String message)
+        {
+            this.message = message;
+            return this;
+        }
+
+        public ResponseBuilder success(String message, int code)
+        {
+            this.message = message;
+            this.code = code;
+            return this;
+        }
+
+        public ResponseBuilder failed(String message, int code)
+        {
+            this.code = code;
+            this.message = message;
+            return this;
+        }
+
+        public ResponseBuilder failed(String message)
+        {
+            this.code = 1;
+            this.message = message;
+            return this;
+        }
+    }
+}

+ 23 - 0
HaBookCms.Response/TimeStampResponse.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Response
+{
+    public class TimeStampResponse
+    {
+        public long responseTime = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000);
+        public TimeStampResponse()
+        {
+        }
+        public long getResponseTime()
+        {
+            return this.responseTime;
+        }
+
+        public void setResponseTime(long responseTime)
+        {
+            this.responseTime = responseTime;
+        }
+    }
+}

+ 0 - 8
HaBookCms.Service/Class1.cs

@@ -1,8 +0,0 @@
-using System;
-
-namespace HaBookCms.Service
-{
-    public class Class1
-    {
-    }
-}

+ 18 - 11
HaBookCms.sln

@@ -11,27 +11,29 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03-应用公共", "03-应
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "04-应用扩展", "04-应用扩展", "{CB0A287C-1551-4E69-8CCB-3A32F1CB1536}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.Contest", "HaBookCms.Contest\HaBookCms.Contest.csproj", "{575B43FA-F14A-462D-8EFB-6C710FBDEF2C}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.Contest", "HaBookCms.Contest\HaBookCms.Contest.csproj", "{575B43FA-F14A-462D-8EFB-6C710FBDEF2C}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.Admin", "HaBookCms.Admin\HaBookCms.Admin.csproj", "{8CAC4E2F-A7B0-4302-BE7A-F7A9DF60CB2D}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.Admin", "HaBookCms.Admin\HaBookCms.Admin.csproj", "{8CAC4E2F-A7B0-4302-BE7A-F7A9DF60CB2D}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.Core", "HaBookCms.Core\HaBookCms.Core.csproj", "{4B5A4275-75A6-48AA-A2BF-2739287BB7A3}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.Core", "HaBookCms.Core\HaBookCms.Core.csproj", "{4B5A4275-75A6-48AA-A2BF-2739287BB7A3}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.Service", "HaBookCms.Service\HaBookCms.Service.csproj", "{E095FF77-91C0-472C-82D0-04B1D353B2AC}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.Service", "HaBookCms.Service\HaBookCms.Service.csproj", "{E095FF77-91C0-472C-82D0-04B1D353B2AC}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.Common", "HaBookCms.Common\HaBookCms.Common.csproj", "{A2AB3D88-32FF-4728-AC3D-B91A48BF6CE1}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.Common", "HaBookCms.Common\HaBookCms.Common.csproj", "{A2AB3D88-32FF-4728-AC3D-B91A48BF6CE1}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.Website", "HaBookCms.Website\HaBookCms.Website.csproj", "{69DA1556-AC8C-4148-9C40-62C7A3237FD4}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.Website", "HaBookCms.Website\HaBookCms.Website.csproj", "{69DA1556-AC8C-4148-9C40-62C7A3237FD4}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.AzureStorage", "HaBookCms.AzureStorage\HaBookCms.AzureStorage.csproj", "{C7C8115C-90B7-4803-95A4-2A93DBC7F1B8}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.AzureStorage", "HaBookCms.AzureStorage\HaBookCms.AzureStorage.csproj", "{C7C8115C-90B7-4803-95A4-2A93DBC7F1B8}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.AzureCosmos", "HaBookCms.AzureCosmos\HaBookCms.AzureCosmos.csproj", "{4AF8EF42-68AE-44CB-BF5B-E9AADFC967AF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.AzureCosmos", "HaBookCms.AzureCosmos\HaBookCms.AzureCosmos.csproj", "{4AF8EF42-68AE-44CB-BF5B-E9AADFC967AF}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.RedisStorage", "HaBookCms.RedisStorage\HaBookCms.RedisStorage.csproj", "{07BC64F2-517E-422E-9E39-B7CB679D0EAE}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.RedisStorage", "HaBookCms.RedisStorage\HaBookCms.RedisStorage.csproj", "{07BC64F2-517E-422E-9E39-B7CB679D0EAE}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.Extensions", "HaBookCms.Extensions\HaBookCms.Extensions.csproj", "{45E42AFC-0EB4-438D-BEA6-C62441B746AF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.Jwt", "HaBookCms.Jwt\HaBookCms.Jwt.csproj", "{45E42AFC-0EB4-438D-BEA6-C62441B746AF}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.ContextConfig", "HaBookCms.ContextConfig\HaBookCms.ContextConfig.csproj", "{E0426706-E8DC-49A2-9996-B5995367DBCE}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HaBookCms.ContextConfig", "HaBookCms.ContextConfig\HaBookCms.ContextConfig.csproj", "{E0426706-E8DC-49A2-9996-B5995367DBCE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.Response", "HaBookCms.Response\HaBookCms.Response.csproj", "{AEF0F17F-CC2C-44A7-BB92-C77BCF8712D1}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -83,6 +85,10 @@ Global
 		{E0426706-E8DC-49A2-9996-B5995367DBCE}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{E0426706-E8DC-49A2-9996-B5995367DBCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{E0426706-E8DC-49A2-9996-B5995367DBCE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AEF0F17F-CC2C-44A7-BB92-C77BCF8712D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AEF0F17F-CC2C-44A7-BB92-C77BCF8712D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AEF0F17F-CC2C-44A7-BB92-C77BCF8712D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AEF0F17F-CC2C-44A7-BB92-C77BCF8712D1}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -99,6 +105,7 @@ Global
 		{07BC64F2-517E-422E-9E39-B7CB679D0EAE} = {ED40E78C-C863-42B7-8D86-41BF178336BB}
 		{45E42AFC-0EB4-438D-BEA6-C62441B746AF} = {CB0A287C-1551-4E69-8CCB-3A32F1CB1536}
 		{E0426706-E8DC-49A2-9996-B5995367DBCE} = {ED40E78C-C863-42B7-8D86-41BF178336BB}
+		{AEF0F17F-CC2C-44A7-BB92-C77BCF8712D1} = {CB0A287C-1551-4E69-8CCB-3A32F1CB1536}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {AE47BE78-B3F5-4723-ACDF-BC403B131012}