Explorar o código

提交登录验证

黄贺彬 %!s(int64=6) %!d(string=hai) anos
pai
achega
b0a3921517

+ 1 - 1
HaBookCms.Admin/Controllers/Sys/UsersController.cs

@@ -20,7 +20,7 @@ namespace HaBookCms.Admin.Controllers.Sys
     [Authorize(Policy = "RequireAdmin")]
     [Produces("application/json")]
     [Route("api/Users")]
-    public class UsersController : Controller
+    public class SysUsersController : Controller
     {
         PermissionRequirement _requirement;
         /// <summary>

+ 0 - 8
HaBookCms.AzureCosmos/Class1.cs

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

+ 9 - 0
HaBookCms.AzureStorage/HaBookCms.AzureStorage.csproj

@@ -4,4 +4,13 @@
     <TargetFramework>netcoreapp2.2</TargetFramework>
   </PropertyGroup>
 
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.2.0" />
+    <PackageReference Include="WindowsAzure.Storage" Version="9.3.3" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\HaBookCms.Jwt\HaBookCms.Jwt.csproj" />
+  </ItemGroup>
+
 </Project>

+ 280 - 0
HaBookCms.AzureStorage/Implements/AzureTableDBRepository.cs

@@ -0,0 +1,280 @@
+using Microsoft.Extensions.Options;
+using HaBookCms.AzureStorage.Options;
+using Microsoft.WindowsAzure.Storage;
+using Microsoft.WindowsAzure.Storage.Table;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using HaBookCms.AzureStorage.Interfaces;
+using HaBookCms.Jwt.Model;
+
+namespace HaBookCms.AzureStorage.Implements
+{
+    public class AzureTableDBRepository : IAzureTableDBRepository
+    {
+
+        public string _connectionString { get; set; }
+        public CloudTable table;
+        //public AzureTableDBRepository(IOptions<DatabaseOptions> optionsAccessor)
+        //{
+        //    _connectionString = optionsAccessor.Value.ConnectionString;
+        //}
+
+        public AzureTableDBRepository()
+        {
+            _connectionString = BaseConfigModel.Configuration["AppSettings:Azure:TableStorageConnection"];
+
+        }
+        private async Task InitializeTable<T>()
+        {
+            if (table == null)
+            {
+                Type t = typeof(T);
+                string StorageConnectionString = _connectionString;
+                var storageAccount = CloudStorageAccount.Parse(StorageConnectionString);
+                CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
+                table = tableClient.GetTableReference(t.Name);
+                await table.CreateIfNotExistsAsync();
+            }
+        }
+
+        public async Task<List<T>> FindAll<T>() where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            var exQuery = new TableQuery<T>();
+            return await QueryList<T>(exQuery);
+        }
+
+        private async Task<List<T>> QueryList<T>(TableQuery<T> exQuery) where T : TableEntity, new()
+        {
+            TableContinuationToken continuationToken = null;
+            List<T> entitys = new List<T>();
+            do
+            {
+                var result = await table.ExecuteQuerySegmentedAsync(exQuery, continuationToken);
+                if (result.Results.Count > 0)
+                {
+                    entitys.AddRange(result.ToList());
+                }
+                continuationToken = result.ContinuationToken;
+            } while (continuationToken != null);
+            return entitys;
+        }
+
+        private async Task<T> QueryObject<T>(TableQuery<T> exQuery) where T : TableEntity, new()
+        {
+            TableContinuationToken continuationToken = null;
+            T entity = new T();
+            do
+            {
+                var result = await table.ExecuteQuerySegmentedAsync(exQuery, continuationToken);
+                if (result.Results.Count > 0)
+                {
+                    entity = result.ToList().Single();
+                }
+                continuationToken = result.ContinuationToken;
+            } while (continuationToken != null);
+            return entity;
+        }
+
+        public async Task<int> Count<T>() where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            TableContinuationToken continuationToken = null;
+            var exQuery = new TableQuery<T>();
+            List<T> entitys = new List<T>();
+            do
+            {
+                var result = await table.ExecuteQuerySegmentedAsync(exQuery, continuationToken);
+                if (result.Results.Count > 0)
+                {
+                    entitys.AddRange(result.ToList());
+                }
+                continuationToken = result.ContinuationToken;
+            } while (continuationToken != null);
+            return entitys.Count;
+        }
+
+        public async Task<T> FindById<T>(string id) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            var exQuery = new TableQuery<T>();
+            if (string.IsNullOrEmpty(id))
+            {
+                exQuery.Where(TableQuery.GenerateFilterCondition("Id", QueryComparisons.Equal, id));
+            }
+            return await QueryObject<T>(exQuery);
+
+        }
+
+        public async Task<List<T>> FindListByDict<T>(Dictionary<string, object> dict) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            var exQuery = new TableQuery<T>();
+            if (null != dict && dict.Count > 0)
+            {
+                var keys = dict.Keys;
+                foreach (string key in keys)
+                {
+                    if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString()))
+                    {
+                        exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal,
+                                                                           dict[key].ToString()));
+                    }
+                }
+            }
+            return await QueryList<T>(exQuery);
+        }
+
+        public async Task<List<T>> FindListByKey<T>(string key, string value) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+
+            var exQuery = new TableQuery<T>();
+            if (string.IsNullOrEmpty(key) && string.IsNullOrEmpty(value))
+            {
+                exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, value));
+            }
+            return await QueryList<T>(exQuery);
+        }
+
+        public async Task<T> FindOneByDict<T>(IDictionary<string, object> dict) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            var exQuery = new TableQuery<T>();
+            if (null != dict && dict.Count > 0)
+            {
+                var keys = dict.Keys;
+                foreach (string key in keys)
+                {
+                    if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString()))
+                    {
+                        exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString()));
+                    }
+                }
+            }
+            return await QueryObject<T>(exQuery);
+        }
+
+        public async Task<T> FindOneByKey<T>(string key, string value) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            var exQuery = new TableQuery<T>();
+            if (string.IsNullOrEmpty(key) && string.IsNullOrEmpty(value))
+            {
+                exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal,
+                                                                          value));
+            }
+            return await QueryObject<T>(exQuery);
+        }
+
+        public async Task<List<T>> GetEntities<T>(IDictionary<string, object> dict) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            var exQuery = new TableQuery<T>();
+            if (null != dict && dict.Count > 0)
+            {
+                var keys = dict.Keys;
+                foreach (string key in keys)
+                {
+                    if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString()))
+                    {
+                        exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal,
+                                                                            dict[key].ToString()));
+                    }
+                }
+            }
+            return await QueryList<T>(exQuery);
+        }
+
+
+
+        public async Task<List<T>> SaveAll<T>(List<T> entitys) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            IList<TableResult> result = null;
+            Parallel.ForEach(Partitioner.Create(0, entitys.Count, 100),
+                  async range =>
+                  {
+                      TableBatchOperation batchOperation = new TableBatchOperation();
+                      for (Int32 i = range.Item1; i < range.Item2; i++)
+                          batchOperation.Insert(entitys[i]);
+                      result = await table.ExecuteBatchAsync(batchOperation);
+                  });
+            return (List<T>)result;
+        }
+
+        public async Task<List<T>> UpdateAll<T>(List<T> entitys) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            IList<TableResult> result = null;
+            Parallel.ForEach(Partitioner.Create(0, entitys.Count, 100),
+                  async range =>
+                  {
+                      TableBatchOperation batchOperation = new TableBatchOperation();
+                      for (Int32 i = range.Item1; i < range.Item2; i++)
+                          batchOperation.Replace(entitys[i]);
+                      result = await table.ExecuteBatchAsync(batchOperation);
+                  });
+            return (List<T>)result;
+        }
+
+        public async Task<List<T>> DeleteAll<T>(List<T> entitys) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            IList<TableResult> result = null;
+            Parallel.ForEach(Partitioner.Create(0, entitys.Count, 100),
+                  async range =>
+                  {
+                      TableBatchOperation batchOperation = new TableBatchOperation();
+                      for (Int32 i = range.Item1; i < range.Item2; i++)
+                          batchOperation.Delete(entitys[i]);
+                      result = await table.ExecuteBatchAsync(batchOperation);
+                  });
+            return (List<T>)result;
+        }
+
+        public async Task<T> Save<T>(TableEntity entity) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            TableOperation operation = TableOperation.Insert(entity);
+            TableResult result = await table.ExecuteAsync(operation);
+            return (T)result.Result;
+        }
+
+        public async Task<T> Update<T>(TableEntity entity) where T : TableEntity, new()
+        {
+            await InitializeTable<T>();
+            TableOperation operation = TableOperation.Replace(entity);
+            TableResult result = await table.ExecuteAsync(operation);
+            return (T)result.Result;
+        }
+
+        public async Task<T> Delete<T>(TableEntity entity) where T : TableEntity, new()
+        {
+
+            await InitializeTable<T>();
+            TableOperation operation = TableOperation.Delete(entity);
+            TableResult result = await table.ExecuteAsync(operation);
+            return (T)result.Result;
+        }
+
+
+        public async Task<List<T>> FindListByDictAndLike<T>(Dictionary<string, object> dict, Dictionary<string, object> likeDict) where T : TableEntity, new()
+        {
+            throw new NotImplementedException();
+        }
+
+        public async Task<List<T>> FindListByDictAndLikeAndNotEQ<T>(Dictionary<string, object> dict, Dictionary<string, object> likeDict, Dictionary<string, object> notEQDict) where T : TableEntity, new()
+        {
+            throw new NotImplementedException();
+        }
+
+        public async Task<List<T>> FindListByDictAndLikeAndStartWith<T>(Dictionary<string, object> dict, Dictionary<string, object> likeDict, Dictionary<string, object> startDict) where T : TableEntity, new()
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

+ 34 - 0
HaBookCms.AzureStorage/Interfaces/IAzureTableDBRepository.cs

@@ -0,0 +1,34 @@
+using Microsoft.WindowsAzure.Storage.Table;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+namespace HaBookCms.AzureStorage.Interfaces
+{
+    public interface IAzureTableDBRepository
+    {
+        Task<List<T>> GetEntities<T>(IDictionary<string, object> dict) where T : TableEntity, new();
+        Task<T> FindOneByDict<T>(IDictionary<string, object> dict) where T : TableEntity, new();
+        Task<T> FindById<T>(string id) where T : TableEntity, new();
+        Task<T> Save<T>(TableEntity entity) where T : TableEntity, new();
+        Task<T> Update<T>(TableEntity entity) where T : TableEntity, new();
+        Task<T> Delete<T>(TableEntity entity) where T : TableEntity, new();
+        Task<T> FindOneByKey<T>(string key, string value) where T : TableEntity, new();
+        Task<List<T>> FindListByDict<T>(Dictionary<string, object> dict) where T : TableEntity, new();
+        Task<List<T>> FindListByKey<T>(string key, string value) where T : TableEntity, new();
+        Task<List<T>> FindAll<T>() where T : TableEntity, new();
+        Task<List<T>> DeleteAll<T>(List<T> entitys) where T : TableEntity, new();
+        Task<List<T>> UpdateAll<T>(List<T> entitys) where T : TableEntity, new();
+        Task<List<T>> SaveAll<T>(List<T> entitys) where T : TableEntity, new();
+        Task<List<T>> FindListByDictAndLike<T>(
+            Dictionary<string, object> dict,
+            Dictionary<string, object> likeDict) where T : TableEntity, new();
+        Task<List<T>> FindListByDictAndLikeAndStartWith<T>(
+            Dictionary<string, object> dict,
+            Dictionary<string, object> likeDict,
+            Dictionary<string, object> startDict) where T : TableEntity, new();
+        Task<List<T>> FindListByDictAndLikeAndNotEQ<T>(
+            Dictionary<string, object> dict,
+            Dictionary<string, object> likeDict,
+            Dictionary<string, object> notEQDict) where T : TableEntity, new();
+        Task<int> Count<T>() where T : TableEntity, new();
+    }
+}

+ 11 - 0
HaBookCms.AzureStorage/Options/DatabaseOptions.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.AzureStorage.Options
+{
+    public class DatabaseOptions
+    {
+        public string ConnectionString { get; set; } = null;
+    }
+}

+ 26 - 0
HaBookCms.Common/CryptHelper/GuidHelper.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HaBookCms.Common.CryptHelper
+{
+    public class GuidHelper
+    {
+        /// <summary>
+        /// 获取UUID对象字符串
+        /// </summary>
+        /// <returns></returns>
+        public static string GetGuidInfo()
+        {
+            return System.Guid.NewGuid().ToString();
+        }
+        /// <summary>
+        /// 获取UUID字符串 不含-
+        /// </summary>
+        /// <returns></returns>
+        public static string GetGuidString()
+        {
+            return System.Guid.NewGuid().ToString().Replace("-", "");
+        }
+    }
+}

+ 1 - 1
HaBookCms.Common/JsonHelper/ErrorModel.cs

@@ -8,7 +8,7 @@ namespace HaBookCms.Common.JsonHelper
     [MessagePackObject(keyAsPropertyName: true)]
     public class ErrorModel
     {
-        public int code { get; set; }
+        public float code { get; set; }
         public string message { get; set; }
         public object data { get; set; }
     }

+ 1 - 1
HaBookCms.Common/JsonHelper/JosnRPCResponse.cs

@@ -10,7 +10,7 @@ namespace HaBookCms.Common.JsonHelper
     {
         public string jsonrpc { get; set; } = "2.0";
         public T result { get; set; }
-        public int id { get; set; } = 1;
+        public double id { get; set; } 
         public ErrorModel error { get; set; } = null;
     }
 }

+ 48 - 31
HaBookCms.Contest/Controllers/UsersController.cs

@@ -1,8 +1,11 @@
-using HaBookCms.Common.Constants;
+using HaBookCms.AzureStorage.Interfaces;
+using HaBookCms.Common.Constants;
 using HaBookCms.Common.CryptHelper;
 using HaBookCms.Common.HttpHelper;
 using HaBookCms.Common.JsonHelper;
+using HaBookCms.Common.ValidateHelper;
 using HaBookCms.Core.Dtos;
+using HaBookCms.Core.Models.Common;
 using HaBookCms.Jwt.Model;
 using Microsoft.AspNetCore.Authentication.JwtBearer;
 using Microsoft.AspNetCore.Authorization;
@@ -24,41 +27,59 @@ namespace HaBookCms.Contest.Controllers
     /// </summary>
     [Authorize( Roles   = "ContestWeb")]
    // [Produces("application/json")]
-    [Route("api/Users")]
+    [Route("api/cmsUsers")]
     [ApiController]
-    public class UsersController : BaseController
+    public class CmsUsersController : BaseController
     {
-        PermissionRequirement _requirement;
+
+        public IAzureTableDBRepository _repository;
+        public CmsUsersController(IAzureTableDBRepository repository)
+        {
+            _repository = repository;
+        }
         /// <summary>
-        /// 获取JWT的方法 3.0
+        /// 
         /// </summary>
-        /// <param name="name"></param>
-        /// <param name="pass"></param>
+        /// <param name="ticketInfo"></param>
         /// <returns></returns>
         [HttpPost]
         [Route("checkLogin")]
         [EnableCors("any")]
         [AllowAnonymous]
-        public async Task<object> checkLogin()
+        public async Task<object> checkLogin(TicketInfo ticketInfo)
         {
-            TicketInfo ticketInfo = new TicketInfo();
+            //TicketInfo ticketInfo = new TicketInfo();
             string jwtStr = string.Empty;
-            //  var user = await sysUserInfoServices.GetUserRoleNameStr(name, pass);
-            var user = "aaa";
-            if (user != null)
+
+            var tmdInfo = CheckTicketInfo(ticketInfo);
+            if (tmdInfo != null)
             {
                 //如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色
                 var claims = new List<Claim> {
                     new Claim(ClaimTypes.Name, ticketInfo.teamModelId),
-                    new Claim(ClaimTypes.MobilePhone,""),
-                    new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) };
-               // claims.AddRange(user.Split(',').Select(s => new Claim(ClaimTypes.Role, s)));
-
+                    new Claim(ClaimTypes.MobilePhone,tmdInfo.countryCode+tmdInfo.cellphone)
+                   // 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);
-
-                var token = JwtToken.BuildJwtToken(claims.ToArray(), _requirement);
+                JwtToken token = JwtToken.BuildJwtToken(claims.ToArray()
+                    //, _requirement
+                    );
+                string  guid=GuidHelper.GetGuidInfo();
+                long time = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
+                LoginInfo loginInfo = new LoginInfo {
+                    RowKey= guid,
+                    PartitionKey=guid,
+                    guid = guid,
+                    teamModelId = ticketInfo.teamModelId,
+                    loginTime = time,
+                    jwtToken = token.token,
+                    timeout = time + token.expires_in,
+                    ticket =ticketInfo.ticket
+                };
+                LoginInfo login= await _repository.Save<LoginInfo>(loginInfo);
                 return new JsonResult(token);
             }
             else
@@ -73,32 +94,28 @@ namespace HaBookCms.Contest.Controllers
 
         private TeamModelIdInfo CheckTicketInfo(TicketInfo ticketInfo)
         {
-
-           
-
-
-            if (ticketInfo != null
-                && !string.IsNullOrEmpty(ticketInfo.sign)
-                && !string.IsNullOrEmpty(ticketInfo.ticket)
-                && !string.IsNullOrEmpty(ticketInfo.teamModelId))
+            if (ValidateHelper.IsValid(ticketInfo))
             {
-                string md5info = Md5Crypt.GetMd5String(ticketInfo.ticket);
+                //string md5info = Md5Crypt.GetMd5String(ticketInfo.ticket);
+                string md5info = ticketInfo.ticket;
                 if (md5info.Equals(ticketInfo.sign))
                 {
                     Dictionary<string, string> dict = new Dictionary<string, string>();
-                    dict.Add(Constant.AUTHORIZATION, Configuration["HaBookAuth:UserInfoKey"]);
+                    string userInfoKey = BaseConfigModel.Configuration["HaBookAuth:UserInfoKey"];
+                    dict.Add(Constant.AUTHORIZATION, userInfoKey);
                     JosnRPCRequest<Dictionary<string, object>> request = new JosnRPCRequest<Dictionary<string, object>>();
-                    request.method = "method";
+                    request.method = "UserInfo";
                     Dictionary<string, object> ticket = new Dictionary<string, object>();
                     ticket.Add("ticket",ticketInfo.ticket);
                     request.@params = ticket;
                     string data = MessagePackHelper.ObjectToJson(request);
-                    string jsonStr = HttpHelper.HttpPost(Configuration["HaBookAuth:AccountUrl"], data, dict,Constant.CONTENT_TYPE_JSON, 1000, Encoding.UTF8);
+                    string jsonStr = HttpHelper.HttpPost(BaseConfigModel.Configuration["HaBookAuth:AccountUrl"], data, dict,Constant.CONTENT_TYPE_JSON, 1000, Encoding.UTF8);
                     if (!string.IsNullOrEmpty(jsonStr))
                     {
                         JosnRPCResponse<TeamModelIdInfo> response = MessagePackHelper.JsonToObject<JosnRPCResponse<TeamModelIdInfo>>(jsonStr);
-                        if (response.error == null) {
+                        if (response.error == null && response.result!=null) {
                             TeamModelIdInfo teamModelIdInfo = response.result;
+                            return teamModelIdInfo;
                         }
                     }
                 }

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

@@ -13,6 +13,7 @@
 
 
   <ItemGroup>
+    <ProjectReference Include="..\HaBookCms.AzureStorage\HaBookCms.AzureStorage.csproj" />
     <ProjectReference Include="..\HaBookCms.Common\HaBookCms.Common.csproj" />
     <ProjectReference Include="..\HaBookCms.ContextConfig\HaBookCms.ContextConfig.csproj" />
     <ProjectReference Include="..\HaBookCms.Core\HaBookCms.Core.csproj" />

+ 6 - 2
HaBookCms.Contest/Startup.cs

@@ -5,6 +5,9 @@ using System.Security.Claims;
 using System.Text;
 using System.Text.Encodings.Web;
 using System.Text.Unicode;
+using HaBookCms.AzureStorage.Implements;
+using HaBookCms.AzureStorage.Interfaces;
+using HaBookCms.AzureStorage.Options;
 using HaBookCms.Common.LogHelper;
 using HaBookCms.ContextConfig.Exceptions;
 using HaBookCms.Jwt.Filter;
@@ -45,12 +48,13 @@ namespace HaBookCms.Contest
             XmlConfigurator.Configure(repository, new FileInfo("Log4net.config"));
             BaseConfigModel.SetBaseConfig(Configuration, env.ContentRootPath, env.WebRootPath);
         }
-
+        
         public IConfiguration Configuration { get; }
 
         // This method gets called by the runtime. Use this method to add services to the container.
         public void ConfigureServices(IServiceCollection services)
         {
+            services.AddSingleton(typeof(IAzureTableDBRepository), typeof(AzureTableDBRepository));
             services.Configure<CookiePolicyOptions>(options =>
             {
                 // This lambda determines whether user consent for non-essential cookies is needed for a given request.
@@ -112,7 +116,7 @@ namespace HaBookCms.Contest
                 signingCredentials,//签名凭据
                 expiration: TimeSpan.FromSeconds(60 * 2)//接口的过期时间
                 );
-
+           // services.AddSingleton<PermissionRequirement, PermissionRequirement>();
             #region 授权
             services.AddAuthorization(options =>
             {

+ 0 - 8
HaBookCms.ContextConfig/Class1.cs

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

+ 4 - 4
HaBookCms.Core/Dtos/TicketInfo.cs

@@ -10,13 +10,13 @@ namespace HaBookCms.Core.Dtos
     /// </summary>
     public class TicketInfo
     {
-        [Required]
+        [Required(ErrorMessage = "ticket不能为空")]
         public string ticket { get; set; }
-        [Required]
+        [Required(ErrorMessage = "name不能为空")]
         public string name { get; set; }
-        [Required]
+        [Required(ErrorMessage = "sign不能为空")]
         public string sign { get; set; }
-        [Required]
+        [Required(ErrorMessage = "teamModelId不能为空")]
         public string teamModelId { get; set; }
     }
 }

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

@@ -9,6 +9,10 @@
     <Folder Include="Models\Website\" />
   </ItemGroup>
 
+  <ItemGroup>
+    <PackageReference Include="WindowsAzure.Storage" Version="9.3.3" />
+  </ItemGroup>
+
   <ItemGroup>
     <Reference Include="MessagePack">
       <HintPath>C:\Program Files\dotnet\sdk\NuGetFallbackFolder\messagepack\1.7.3.4\lib\netstandard2.0\MessagePack.dll</HintPath>

+ 12 - 12
HaBookCms.Core/Models/Common/CmsUser.cs

@@ -9,17 +9,17 @@ namespace HaBookCms.Core.Models.Common
     [MessagePackObject(keyAsPropertyName: true)]
     public class CmsUser
     {
-        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; }
+        public string guid { get; set; }
+        public string fullName { get; set; }
+        public string nickName { get; set; }
+        public string sex { get; set; }
+        public string cellphone { 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; }
     }
 }

+ 10 - 12
HaBookCms.Core/Models/Common/LoginInfo.cs

@@ -1,42 +1,40 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
+using Microsoft.WindowsAzure.Storage.Table;
 
 namespace HaBookCms.Core.Models.Common
 {
-    public class LoginInfo
+    public class LoginInfo : TableEntity
     {
         /// <summary>
         /// 自动生成
         /// </summary>
-        public string Guid { get; set; }
+        public string guid { get; set; }
         /// <summary>
         /// 醍摩豆ID
         /// </summary>
-        public string TeamModelId { get; set; }
+        public string teamModelId { get; set; }
         /// <summary>
         /// 登录时间
         /// </summary>
-        public long LoginTime { get; set; }
+        public long loginTime { get; set; }
         /// <summary>
         /// token
         /// </summary>
-        public string JwtToken { get; set; }
+        public string jwtToken { get; set; }
         /// <summary>
         /// 超时(秒)数
         /// </summary>
-        public long Timeout { get; set; }
+        public double timeout { get; set; }
         /// <summary>
         /// 到期时间
         /// </summary>
-        public long  Expires { get; set; }
+        public long  expires { get; set; }
         /// <summary>
         /// 醍摩豆 验证ticket
         /// </summary>
-        public string Ticket { get; set; }
+        public string ticket { get; set; }
         /// <summary>
         /// 登录端 以便支持多端登录
         /// </summary>
-        public string AppTokenType { get; set; }
+        public string appTokenType { get; set; }
     }
 }

+ 22 - 0
HaBookCms.IP2Region/DataIP2Region.cs

@@ -0,0 +1,22 @@
+using IP2Region;
+using IP2Region.Models;
+using System;
+using System.Threading.Tasks;
+
+namespace HaBookCms.IP2Region
+{
+    public class DataIP2Region
+    {
+        public static async Task<DataBlock> IP2Region(string ip)
+        {
+            using (var _search = new DbSearcher(Environment.CurrentDirectory + @"\ip2region.db"))
+            {
+                var memResult = await _search.MemorySearchAsync(ip).ConfigureAwait(false);
+                return memResult;
+                //_search.MemorySearch("183.192.62.65").Region;
+                //_search.BinarySearch("183.192.62.65").Region;
+                //_search.BtreeSearch("183.192.62.65").Region;
+            }
+        }
+    }
+}

+ 11 - 0
HaBookCms.IP2Region/HaBookCms.IP2Region.csproj

@@ -0,0 +1,11 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.2</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="IP2Region" Version="1.2.0" />
+  </ItemGroup>
+
+</Project>

BIN=BIN
HaBookCms.JosnRPCTest/DB/ip2region.db


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

@@ -8,6 +8,7 @@
   <ItemGroup>
     <ProjectReference Include="..\HaBookCms.Common\HaBookCms.Common.csproj" />
     <ProjectReference Include="..\HaBookCms.Core\HaBookCms.Core.csproj" />
+    <ProjectReference Include="..\HaBookCms.IP2Region\HaBookCms.IP2Region.csproj" />
   </ItemGroup>
 
 </Project>

+ 11 - 4
HaBookCms.JosnRPCTest/Program.cs

@@ -2,11 +2,14 @@
 using HaBookCms.Common.ValidateHelper;
 using HaBookCms.Core.Dtos;
 using HaBookCms.Core.Models.Common;
+using HaBookCms.IP2Region;
+using IP2Region.Models;
 using MessagePack;
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.ComponentModel.DataAnnotations;
+using System.Threading.Tasks;
 
 namespace HaBookCms.JosnRPCTest
 {
@@ -14,10 +17,13 @@ namespace HaBookCms.JosnRPCTest
     {
         static void Main(string[] args)
         {
+            string rp = "{\"id\":1.0,\"jsonrpc\":\"2.0\",\"result\":null,\"error\":{\"code\":-32601,\"message\":\"No method found with the requested signature or multiple methods matched the request.\",\"data\":null}}";
+            JosnRPCResponse<TeamModelIdInfo> rs= MessagePackHelper.JsonToObject<JosnRPCResponse<TeamModelIdInfo>>(rp);
+            Task<DataBlock> dataBlock= DataIP2Region.IP2Region("110.185.29.187");
             JosnRPCResponse<List<CmsUser>> response = new JosnRPCResponse<List<CmsUser>>();
             List<CmsUser> users = new List<CmsUser>();
             CmsUser user = new CmsUser();
-            user.City = "123";
+            user.city = "123";
             users.Add(user);
             response.result= users;
             string json=  MessagePackHelper.ObjectToJson(response);
@@ -27,13 +33,14 @@ namespace HaBookCms.JosnRPCTest
             JosnRPCRequest<Dictionary<string, object>> request = new JosnRPCRequest<Dictionary<string, object>>();
             request.method = "method";
             Dictionary<string, object> ticket = new Dictionary<string, object>();
-            ticket.Add("ticket", "1111");
+            ticket.Add("ticket", "11111111");
             request.@params = ticket;
             string data = MessagePackHelper.ObjectToJson(request);
             TicketInfo ticketInfo = new TicketInfo();
-            ticketInfo.name = "1";
-            ticketInfo.ticket = "1";
+            ticketInfo.name = "";
+            ticketInfo.ticket = "";
             ValidateHelper.IsValid(ticketInfo);
+          
             Console.WriteLine("HelMlo World!");
         }
     }

BIN=BIN
HaBookCms.JosnRPCTest/ip2region.db


+ 14 - 8
HaBookCms.Jwt/Model/JwtToken.cs

@@ -1,4 +1,5 @@
-using System;
+using Microsoft.IdentityModel.Tokens;
+using System;
 using System.Collections.Generic;
 using System.IdentityModel.Tokens.Jwt;
 using System.Security.Claims;
@@ -11,33 +12,38 @@ namespace HaBookCms.Jwt.Model
     /// </summary>
     public class JwtToken
     {
+        public string token_type { get; set; }
+        public string token { get; set; }
+        public double expires_in { get; set; }
         /// <summary>
         /// 获取基于JWT的Token
         /// </summary>
         /// <param name="claims">需要在登陆的时候配置</param>
         /// <param name="permissionRequirement">在startup中定义的参数</param>
         /// <returns></returns>
-        public static dynamic BuildJwtToken(Claim[] claims, PermissionRequirement permissionRequirement)
+        public static JwtToken BuildJwtToken(Claim[] claims
+            //, PermissionRequirement permissionRequirement
+            )
         {
             var now = DateTime.Now;
             // 实例化JwtSecurityToken
             var jwt = new JwtSecurityToken(
-                issuer: permissionRequirement.Issuer,
-                audience: permissionRequirement.Audience,
+                issuer: BaseConfigModel.Configuration["JwtAuth:Issuer"],
+                audience: BaseConfigModel.Configuration["JwtAuth:Audience"],
                 claims: claims,
                 notBefore: now,
-                expires: now.Add(permissionRequirement.Expiration),
-                signingCredentials: permissionRequirement.SigningCredentials
+                expires: now.Add(TimeSpan.FromSeconds(60 * 2)),
+                signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(BaseConfigModel.Configuration["JwtAuth:SecurityKey"])), SecurityAlgorithms.HmacSha256)
             );
             // 生成 Token
             var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);
 
             //打包返回前台
             var responseJson = new
+            JwtToken
             {
-                success = true,
                 token = encodedJwt,
-                expires_in = permissionRequirement.Expiration.TotalSeconds,
+                expires_in = TimeSpan.FromSeconds(60 * 2).TotalSeconds,
                 token_type = "Bearer"
             };
             return responseJson;

+ 0 - 1
HaBookCms.Response/BaseResponse.cs

@@ -1,6 +1,5 @@
 using System;
 using System.Collections.Generic;
-using System.Text;
 
 namespace HaBookCms.Response
 {

+ 7 - 0
HaBookCms.sln

@@ -39,6 +39,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "05-应用测试", "05-应
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.JosnRPCTest", "HaBookCms.JosnRPCTest\HaBookCms.JosnRPCTest.csproj", "{0FB3E14C-41DF-4686-BD7C-7A6E03B1C548}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HaBookCms.IP2Region", "HaBookCms.IP2Region\HaBookCms.IP2Region.csproj", "{F7832670-7572-4EE7-A61B-9732DE01E9FC}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -97,6 +99,10 @@ Global
 		{0FB3E14C-41DF-4686-BD7C-7A6E03B1C548}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0FB3E14C-41DF-4686-BD7C-7A6E03B1C548}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0FB3E14C-41DF-4686-BD7C-7A6E03B1C548}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F7832670-7572-4EE7-A61B-9732DE01E9FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F7832670-7572-4EE7-A61B-9732DE01E9FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F7832670-7572-4EE7-A61B-9732DE01E9FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F7832670-7572-4EE7-A61B-9732DE01E9FC}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -115,6 +121,7 @@ Global
 		{E0426706-E8DC-49A2-9996-B5995367DBCE} = {ED40E78C-C863-42B7-8D86-41BF178336BB}
 		{AEF0F17F-CC2C-44A7-BB92-C77BCF8712D1} = {CB0A287C-1551-4E69-8CCB-3A32F1CB1536}
 		{0FB3E14C-41DF-4686-BD7C-7A6E03B1C548} = {4B1BDA90-D27E-4597-9B68-D1D9273F0B5D}
+		{F7832670-7572-4EE7-A61B-9732DE01E9FC} = {CB0A287C-1551-4E69-8CCB-3A32F1CB1536}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {AE47BE78-B3F5-4723-ACDF-BC403B131012}