部分组件转入独立扩展包
This commit is contained in:
parent
c820d37521
commit
a3556cf246
|
@ -1,105 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Security.Cryptography;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace FAuth.Extensions.Decryptor
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 加密帮助类
|
|
||||||
/// </summary>
|
|
||||||
public class EncryptyWorker
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 补位填充方式
|
|
||||||
/// </summary>
|
|
||||||
public PaddingMode Padding { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// 加密算法模式
|
|
||||||
/// </summary>
|
|
||||||
public CipherMode Cipher { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// 初始化向量
|
|
||||||
/// </summary>
|
|
||||||
public byte[] IV { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// 加密字符串获取Base64密文
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">加密key</param>
|
|
||||||
/// <param name="str">要加密的字符串</param>
|
|
||||||
public string Encrypty(string key,string str) {
|
|
||||||
if(key.Length < 8) {
|
|
||||||
throw new Exception("加密用的key长度为8位");
|
|
||||||
}
|
|
||||||
byte[] bKey = Encoding.UTF8.GetBytes(key.Substring(0,8));
|
|
||||||
byte[] bStr = Encoding.UTF8.GetBytes(str);
|
|
||||||
var desc = createProvider();
|
|
||||||
using(var mStream = new MemoryStream()) {
|
|
||||||
using(var cStream = new CryptoStream(mStream,desc.CreateEncryptor(bKey,IV),CryptoStreamMode.Write)) {
|
|
||||||
cStream.Write(bStr,0,bStr.Length);
|
|
||||||
cStream.FlushFinalBlock();
|
|
||||||
return Convert.ToBase64String(mStream.ToArray());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 从Base64密文解密,获取字符串
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">加密键</param>
|
|
||||||
/// <param name="str">密文</param>
|
|
||||||
public string DesCrypty(string key,string str) {
|
|
||||||
if(key.Length < 8) {
|
|
||||||
throw new Exception("加密用的key长度为8位");
|
|
||||||
}
|
|
||||||
var bStr = Convert.FromBase64String(str);
|
|
||||||
byte[] bKey = Encoding.UTF8.GetBytes(key.Substring(0,8));
|
|
||||||
var desc = createProvider();
|
|
||||||
using(var mStream = new MemoryStream()) {
|
|
||||||
using(var cStream = new CryptoStream(mStream,desc.CreateDecryptor(bKey,IV),CryptoStreamMode.Write)) {
|
|
||||||
cStream.Write(bStr,0,bStr.Length);
|
|
||||||
cStream.FlushFinalBlock();
|
|
||||||
return Encoding.UTF8.GetString(mStream.ToArray());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private DESCryptoServiceProvider createProvider() {
|
|
||||||
var desc = new DESCryptoServiceProvider();
|
|
||||||
desc.Padding = this.Padding;
|
|
||||||
desc.Mode = this.Cipher;
|
|
||||||
return desc;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static EncryptyWorker Deshelper { get; set; }
|
|
||||||
|
|
||||||
private EncryptyWorker() { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 重用模式获取默认加密帮助器
|
|
||||||
/// </summary>
|
|
||||||
public static EncryptyWorker GetHelper() {
|
|
||||||
if(Deshelper == null) {
|
|
||||||
byte[] IV = { 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08 };
|
|
||||||
Deshelper = GetHelper(PaddingMode.PKCS7,CipherMode.CBC,IV);
|
|
||||||
|
|
||||||
}
|
|
||||||
return Deshelper;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 生成新的加密帮助器
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="padding">补位方式</param>
|
|
||||||
/// <param name="cipher">加密算法模式</param>
|
|
||||||
/// <param name="IV">初始化向量</param>
|
|
||||||
public static EncryptyWorker GetHelper(PaddingMode padding,CipherMode cipher,byte[] IV) {
|
|
||||||
return new EncryptyWorker {
|
|
||||||
Cipher = cipher,
|
|
||||||
IV = IV,
|
|
||||||
Padding = padding,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace FAuth.Extensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 数据缓冲提供器接口
|
|
||||||
/// </summary>
|
|
||||||
public interface ICacheProvider
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 设置缓存数据
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T">数据类型</typeparam>
|
|
||||||
/// <param name="key">数据键</param>
|
|
||||||
/// <param name="obj">数据对象</param>
|
|
||||||
/// <param name="span">缓存时间或者从CacheTimeSpan选择值</param>
|
|
||||||
void SetCache<T>(string key,T obj,TimeSpan span) where T : class;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 从缓存中获取数据,如果未缓存返回null
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T">数据类型</typeparam>
|
|
||||||
/// <param name="key">缓存数据的键</param>
|
|
||||||
/// <returns>数据对象</returns>
|
|
||||||
T GetObj<T>(string key) where T : class, new();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
namespace FAuth.Extensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Json序列化接口
|
|
||||||
/// </summary>
|
|
||||||
public interface IJsonProvider
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 获取Json字符串
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T">对象类型</typeparam>
|
|
||||||
/// <param name="obj">要序列化的对象</param>
|
|
||||||
/// <returns>Json串</returns>
|
|
||||||
string GetJson<T>(T obj);
|
|
||||||
/// <summary>
|
|
||||||
/// 获取对象
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T">对象类型</typeparam>
|
|
||||||
/// <param name="json">Json串</param>
|
|
||||||
/// <returns>对象</returns>
|
|
||||||
T GetObj<T>(string json);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
using System.Text.Json;
|
|
||||||
|
|
||||||
namespace FAuth.Extensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 微软提供的Json序列化器封装
|
|
||||||
/// </summary>
|
|
||||||
public class MsJsonProvider:IJsonProvider
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 从对象序列化字符串
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T">对象类型</typeparam>
|
|
||||||
/// <param name="obj">要序列化的对象</param>
|
|
||||||
/// <returns>字符串</returns>
|
|
||||||
public string GetJson<T>(T obj) {
|
|
||||||
return JsonSerializer.Serialize<T>(obj);
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 从字符串反序列化对象
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T">对象的类型</typeparam>
|
|
||||||
/// <param name="json">json字符串</param>
|
|
||||||
/// <returns>对象实例</returns>
|
|
||||||
public T GetObj<T>(string json) {
|
|
||||||
return JsonSerializer.Deserialize<T>(json);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
using System;
|
|
||||||
using Microsoft.Extensions.Caching.Distributed;
|
|
||||||
|
|
||||||
namespace FAuth.Extensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 使用微软Redis扩展方法组件实现Redis缓冲
|
|
||||||
/// </summary>
|
|
||||||
public class RedisCacheProvider:ICacheProvider
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 基础缓冲组件
|
|
||||||
/// </summary>
|
|
||||||
public IDistributedCache Cache { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// 基础序列化组件
|
|
||||||
/// </summary>
|
|
||||||
public IJsonProvider Json { get; set; }
|
|
||||||
|
|
||||||
public RedisCacheProvider(IJsonProvider jsonProvider,IDistributedCache distributedCache = null) {
|
|
||||||
this.Cache = distributedCache;
|
|
||||||
this.Json = jsonProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T GetObj<T>(string key) where T : class, new() {
|
|
||||||
if(this.Cache == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
var str = this.Cache.GetString(key);
|
|
||||||
if(str.IsNullOrEmpty()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return this.Json.GetObj<T>(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetCache<T>(string key,T obj,TimeSpan span) where T : class {
|
|
||||||
if(this.Cache == null || obj == null || span == null || span == TimeSpan.Zero) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.Cache.SetString(key,this.Json.GetJson(obj),new DistributedCacheEntryOptions {
|
|
||||||
AbsoluteExpirationRelativeToNow = span,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
namespace FAuth.Extensions
|
|
||||||
{
|
|
||||||
public static class StringExtend
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 扩展判断字符串是否为null或空方法
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="str">字符串</param>
|
|
||||||
/// <returns>如果为Null或Empty或空返回True,否则返回false</returns>
|
|
||||||
public static bool IsNullOrEmpty(this string str) {
|
|
||||||
return str == null ? true : str == string.Empty ? true : str == "" ? true : false;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 判断字符串是否非空
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="str">字符串</param>
|
|
||||||
/// <returns>如果为Null或Empty或空返回False,否则返回True</returns>
|
|
||||||
public static bool IsNotNullOrEmpty(this string str) => !str.IsNullOrEmpty();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,80 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Xml.XPath;
|
|
||||||
using Microsoft.OpenApi.Any;
|
|
||||||
using Microsoft.OpenApi.Models;
|
|
||||||
using Swashbuckle.AspNetCore.SwaggerGen;
|
|
||||||
|
|
||||||
namespace FAuth.Extensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 通过DescriptionAttribute和summary生成枚举说明
|
|
||||||
/// </summary>
|
|
||||||
public class SwaggerXmlEnumFilter:IDocumentFilter
|
|
||||||
{
|
|
||||||
private readonly XPathNavigator _xmlNavigator;
|
|
||||||
|
|
||||||
public static List<Type> AllTypes { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 通过提供应用程序文档生成枚举说明
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="xmlPath"></param>
|
|
||||||
public SwaggerXmlEnumFilter(string xmlPath) {
|
|
||||||
_xmlNavigator = new XPathDocument(xmlPath).CreateNavigator();
|
|
||||||
|
|
||||||
if(AllTypes == null) {
|
|
||||||
AllTypes = new List<Type>();
|
|
||||||
foreach(var ass in AppDomain.CurrentDomain.GetAssemblies()) {
|
|
||||||
AllTypes.AddRange(ass.GetTypes().Where(m => m.IsEnum));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Apply(OpenApiDocument swaggerDoc,DocumentFilterContext context) {
|
|
||||||
var enumList = swaggerDoc.Components.Schemas.Where(m => m.Value.Enum != null && m.Value.Enum.Count > 0);
|
|
||||||
foreach(var item in enumList) {
|
|
||||||
var key = item.Key;
|
|
||||||
var property = item.Value;
|
|
||||||
var itemType = AllTypes.Find(m => m.Name == key);
|
|
||||||
var list = new List<OpenApiInteger>();
|
|
||||||
foreach(var val in property.Enum) {
|
|
||||||
list.Add((OpenApiInteger)val);
|
|
||||||
}
|
|
||||||
property.Description += describeEnum(itemType,list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private string describeEnum(Type type,List<OpenApiInteger> enums) {
|
|
||||||
var enumDescriptions = new List<string>();
|
|
||||||
foreach(var item in enums) {
|
|
||||||
if(type == null)
|
|
||||||
continue;
|
|
||||||
var value = Enum.Parse(type,item.Value.ToString());
|
|
||||||
var desc = getDescription(type,value);
|
|
||||||
|
|
||||||
if(string.IsNullOrEmpty(desc))
|
|
||||||
enumDescriptions.Add($"{item.Value.ToString()}:{Enum.GetName(type,value)}; ");
|
|
||||||
else
|
|
||||||
enumDescriptions.Add($"{item.Value.ToString()}:{Enum.GetName(type,value)},{desc}; ");
|
|
||||||
|
|
||||||
}
|
|
||||||
return $"<br/>{Environment.NewLine}{string.Join("<br/>" + Environment.NewLine,enumDescriptions)}";
|
|
||||||
}
|
|
||||||
|
|
||||||
private string getDescription(Type t,object value) {
|
|
||||||
foreach(var member in t.GetMembers().Where(m => m.Name == t.GetEnumName(value))) {
|
|
||||||
foreach(var attr in member.GetCustomAttributes<DescriptionAttribute>()) {
|
|
||||||
return attr.Description;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var fullName = $"{t.FullName}.{t.GetEnumName(value)}";
|
|
||||||
var desc = _xmlNavigator.SelectSingleNode($"doc/members/member[@name='F:{fullName}']/summary")?.InnerXml;
|
|
||||||
return desc ?? string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
@ -6,11 +6,12 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Falcon.Extend" Version="1.1.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.Redis" Version="2.2.0" />
|
<PackageReference Include="Microsoft.Extensions.Caching.Redis" Version="2.2.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.3" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.3" />
|
||||||
<PackageReference Include="NLog" Version="4.7.0" />
|
<PackageReference Include="NLog" Version="4.7.0" />
|
||||||
<PackageReference Include="NLog.Web.AspNetCore" Version="4.9.1" />
|
<PackageReference Include="NLog.Web.AspNetCore" Version="4.9.1" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.2.1" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.3.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.3" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.3" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.3" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -19,4 +20,8 @@
|
||||||
<None Include="..\.editorconfig" Link=".editorconfig" />
|
<None Include="..\.editorconfig" Link=".editorconfig" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Extensions\Decryptor\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -2,11 +2,10 @@ using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text.Encodings.Web;
|
using System.Text.Encodings.Web;
|
||||||
using System.Text.Unicode;
|
using System.Text.Unicode;
|
||||||
|
using Falcon.Extend;
|
||||||
using FAuth.DataBase;
|
using FAuth.DataBase;
|
||||||
using FAuth.Extensions;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc.Routing;
|
|
||||||
using Microsoft.Extensions.Caching.Redis;
|
using Microsoft.Extensions.Caching.Redis;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
@ -32,16 +31,12 @@ namespace FAuth
|
||||||
/// <param name="services">服务容器</param>
|
/// <param name="services">服务容器</param>
|
||||||
public void ConfigureServices(IServiceCollection services) {
|
public void ConfigureServices(IServiceCollection services) {
|
||||||
//注册Json序列化
|
//注册Json序列化
|
||||||
services.AddSingleton<IJsonProvider,MsJsonProvider>();
|
services.AddMsJsonProvider();
|
||||||
//注册数据库
|
//注册数据库
|
||||||
services.AddDbContext<FAuthDb>();
|
services.AddDbContext<FAuthDb>();
|
||||||
//注册Redis
|
//注册Redis
|
||||||
var rop = this.Configuration.GetSection("Redis").Get<RedisCacheOptions>();
|
var rop = this.Configuration.GetSection("Redis").Get<RedisCacheOptions>();
|
||||||
services.AddDistributedRedisCache(op => {
|
services.AddRedis(rop);
|
||||||
op.InstanceName = rop.InstanceName;
|
|
||||||
op.Configuration = rop.Configuration;
|
|
||||||
});
|
|
||||||
services.AddTransient<ICacheProvider,RedisCacheProvider>();
|
|
||||||
//注册MVC
|
//注册MVC
|
||||||
services.AddControllersWithViews()
|
services.AddControllersWithViews()
|
||||||
.AddJsonOptions(option => {
|
.AddJsonOptions(option => {
|
||||||
|
@ -62,7 +57,7 @@ namespace FAuth
|
||||||
});
|
});
|
||||||
var xmlPath = Path.Combine(AppContext.BaseDirectory,typeof(Program).Assembly.GetName().Name + ".xml");
|
var xmlPath = Path.Combine(AppContext.BaseDirectory,typeof(Program).Assembly.GetName().Name + ".xml");
|
||||||
c.IncludeXmlComments(xmlPath,true);
|
c.IncludeXmlComments(xmlPath,true);
|
||||||
c.DocumentFilter<SwaggerXmlEnumFilter>(xmlPath);
|
c.AddXmlEnumEnable(xmlPath);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user