udpate
This commit is contained in:
@@ -7,8 +7,8 @@ namespace SimApi.Communications;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class SimApiLoginItem
|
public class SimApiLoginItem
|
||||||
{
|
{
|
||||||
public string? Id { get; set; }
|
public string Id { get; set; } = null!;
|
||||||
public string[] Type { get; set; } = new[] { "user" };
|
public string[] Type { get; set; } = ["user"];
|
||||||
public Dictionary<string, string>? Meta { get; set; } = null;
|
public Dictionary<string, string> Meta { get; set; } = new();
|
||||||
public object? Extra { get; set; } = null;
|
public object? Extra { get; set; }
|
||||||
};
|
};
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
#nullable enable
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using Microsoft.Extensions.Caching.Distributed;
|
using Microsoft.Extensions.Caching.Distributed;
|
||||||
using SimApi.Communications;
|
using SimApi.Communications;
|
||||||
@@ -33,7 +31,7 @@ public class SimApiAuth(IDistributedCache cache)
|
|||||||
public SimApiLoginItem? GetLogin(string token)
|
public SimApiLoginItem? GetLogin(string token)
|
||||||
{
|
{
|
||||||
var login = cache.GetString(token);
|
var login = cache.GetString(token);
|
||||||
return login != null ? JsonSerializer.Deserialize<SimApiLoginItem>(login) : default;
|
return login != null ? JsonSerializer.Deserialize<SimApiLoginItem>(login) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ namespace SimApi.Helpers;
|
|||||||
|
|
||||||
public class SimApiCache(IDistributedCache cache)
|
public class SimApiCache(IDistributedCache cache)
|
||||||
{
|
{
|
||||||
private const string Prefix = "SimApi:Cache";
|
private const string Prefix = "SimApi:Cache:";
|
||||||
|
|
||||||
public void Set(string key, object value, DistributedCacheEntryOptions? options = null)
|
public void Set(string key, object value, DistributedCacheEntryOptions? options = null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ public class SimApiJobWebAuth(string user, string pass) : IDashboardAuthorizatio
|
|||||||
var authHeader = httpContext.Request.Headers["Authorization"].FirstOrDefault();
|
var authHeader = httpContext.Request.Headers["Authorization"].FirstOrDefault();
|
||||||
if (authHeader != null && authHeader.StartsWith("Basic "))
|
if (authHeader != null && authHeader.StartsWith("Basic "))
|
||||||
{
|
{
|
||||||
var encodedUsernamePassword = authHeader.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries)[1]?.Trim();
|
var encodedUsernamePassword = authHeader.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries)[1].Trim();
|
||||||
var decodedUsernamePassword = Encoding.UTF8.GetString(Convert.FromBase64String(encodedUsernamePassword));
|
var decodedUsernamePassword = Encoding.UTF8.GetString(Convert.FromBase64String(encodedUsernamePassword));
|
||||||
var username = decodedUsernamePassword.Split(':', 2)[0];
|
var username = decodedUsernamePassword.Split(':', 2)[0];
|
||||||
var password = decodedUsernamePassword.Split(':', 2)[1];
|
var password = decodedUsernamePassword.Split(':', 2)[1];
|
||||||
|
|||||||
+35
-1
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -7,6 +8,7 @@ using System.Text.Json;
|
|||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Text.Unicode;
|
using System.Text.Unicode;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
namespace SimApi.Helpers;
|
namespace SimApi.Helpers;
|
||||||
|
|
||||||
@@ -22,6 +24,7 @@ public static class SimApiUtil
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static JsonSerializerOptions JsonOption => new()
|
public static JsonSerializerOptions JsonOption => new()
|
||||||
{
|
{
|
||||||
|
ReferenceHandler = ReferenceHandler.Preserve,
|
||||||
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
|
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
|
||||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||||
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
|
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
|
||||||
@@ -62,12 +65,43 @@ public static class SimApiUtil
|
|||||||
return stringBuilder.ToString();
|
return stringBuilder.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// sha1加密字符串
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="source">源字符串</param>
|
||||||
|
/// <param name="mode">加密结果"x2"结果为32位,"x3"结果为48位,"x4"结果为64位</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string Sha1(string source, string mode = "x2")
|
||||||
|
{
|
||||||
|
var hash = SHA1.HashData(Encoding.UTF8.GetBytes(source));
|
||||||
|
var sb = new StringBuilder(hash.Length * 2);
|
||||||
|
foreach (var b in hash)
|
||||||
|
{
|
||||||
|
sb.Append(b.ToString(mode));
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 将XML字符串序列化为对象
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="source"></param>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static T XmlDeserialize<T>(string source)
|
||||||
|
{
|
||||||
|
var xmlConvertor = new XmlSerializer(typeof(T));
|
||||||
|
using var reader = new StringReader(source);
|
||||||
|
return (T)xmlConvertor.Deserialize(reader)!;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 将对象序列化成JSON (控制台输出中文不会被编码)
|
/// 将对象序列化成JSON (控制台输出中文不会被编码)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="obj"></param>
|
/// <param name="obj"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string Json(object obj)
|
public static string Json(object? obj)
|
||||||
{
|
{
|
||||||
return JsonSerializer.Serialize(obj, JsonOption);
|
return JsonSerializer.Serialize(obj, JsonOption);
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -23,14 +23,14 @@
|
|||||||
<Folder Include="Exceptions\"/>
|
<Folder Include="Exceptions\"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.17" />
|
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.18" />
|
||||||
<PackageReference Include="Hangfire.Console" Version="1.4.3" />
|
<PackageReference Include="Hangfire.Console" Version="1.4.3" />
|
||||||
<PackageReference Include="Hangfire.Redis.StackExchange" Version="1.9.4" />
|
<PackageReference Include="Hangfire.Redis.StackExchange" Version="1.12.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.1" />
|
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.5" />
|
||||||
<PackageReference Include="Minio" Version="6.0.4" />
|
<PackageReference Include="Minio" Version="6.0.4" />
|
||||||
<PackageReference Include="MQTTnet" Version="5.0.1.1416" />
|
<PackageReference Include="MQTTnet" Version="5.0.1.1416" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="7.2.0" />
|
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="8.1.1" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="7.2.0" />
|
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="8.1.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ProjectExtensions>
|
<ProjectExtensions>
|
||||||
<MonoDevelop>
|
<MonoDevelop>
|
||||||
|
|||||||
+36
-7
@@ -3,6 +3,7 @@ using System.Diagnostics;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
using Hangfire;
|
using Hangfire;
|
||||||
using Hangfire.Console;
|
using Hangfire.Console;
|
||||||
using Hangfire.Redis.StackExchange;
|
using Hangfire.Redis.StackExchange;
|
||||||
@@ -247,7 +248,11 @@ public static class SimApiExtensions
|
|||||||
{
|
{
|
||||||
builder.AddControllers(opt => opt.Filters.Add<SimApiResponseFilter>())
|
builder.AddControllers(opt => opt.Filters.Add<SimApiResponseFilter>())
|
||||||
.AddXmlSerializerFormatters()
|
.AddXmlSerializerFormatters()
|
||||||
.AddJsonOptions(opt => opt.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase);
|
.AddJsonOptions(opt =>
|
||||||
|
{
|
||||||
|
opt.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
||||||
|
opt.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.AddSingleton(simApiOptions);
|
builder.AddSingleton(simApiOptions);
|
||||||
@@ -328,22 +333,46 @@ public static class SimApiExtensions
|
|||||||
logger.LogInformation("开始配置SimApiAuth...");
|
logger.LogInformation("开始配置SimApiAuth...");
|
||||||
builder.UseMiddleware<SimApiAuthMiddleware>();
|
builder.UseMiddleware<SimApiAuthMiddleware>();
|
||||||
builder.MapControllerRoute(name: "GetUserInfo", pattern: "/user/info",
|
builder.MapControllerRoute(name: "GetUserInfo", pattern: "/user/info",
|
||||||
defaults: new { controller = "SimApiCommon", action = "UserInfo" });
|
defaults: new
|
||||||
|
{
|
||||||
|
controller = "SimApiCommon",
|
||||||
|
action = "UserInfo"
|
||||||
|
});
|
||||||
builder.MapControllerRoute(name: "CheckLogin", pattern: "/auth/check",
|
builder.MapControllerRoute(name: "CheckLogin", pattern: "/auth/check",
|
||||||
defaults: new { controller = "SimApiCommon", action = "CheckLogin" });
|
defaults: new
|
||||||
|
{
|
||||||
|
controller = "SimApiCommon",
|
||||||
|
action = "CheckLogin"
|
||||||
|
});
|
||||||
builder.MapControllerRoute(name: "Logout", pattern: "/auth/logout",
|
builder.MapControllerRoute(name: "Logout", pattern: "/auth/logout",
|
||||||
defaults: new { controller = "SimApiCommon", action = "Logout" });
|
defaults: new
|
||||||
|
{
|
||||||
|
controller = "SimApiCommon",
|
||||||
|
action = "Logout"
|
||||||
|
});
|
||||||
if (options.EnableCoceSdk)
|
if (options.EnableCoceSdk)
|
||||||
{
|
{
|
||||||
logger.LogInformation("开始配置CoceAppSdk...\nApi入口: {ApiUrl}\nAuth入口:{AuthUrl}n\nAppId: {AppId}",
|
logger.LogInformation("开始配置CoceAppSdk...\nApi入口: {ApiUrl}\nAuth入口:{AuthUrl}n\nAppId: {AppId}",
|
||||||
options.CoceSdkOptions.ApiEndpoint, options.CoceSdkOptions.AuthEndpoint,
|
options.CoceSdkOptions.ApiEndpoint, options.CoceSdkOptions.AuthEndpoint,
|
||||||
options.CoceSdkOptions.AppId);
|
options.CoceSdkOptions.AppId);
|
||||||
builder.MapControllerRoute(name: "LoginUseCoce", pattern: "/auth/login",
|
builder.MapControllerRoute(name: "LoginUseCoce", pattern: "/auth/login",
|
||||||
defaults: new { controller = "Coce", action = "Login" });
|
defaults: new
|
||||||
|
{
|
||||||
|
controller = "Coce",
|
||||||
|
action = "Login"
|
||||||
|
});
|
||||||
builder.MapControllerRoute(name: "LoginUseCoce", pattern: "/user/groups",
|
builder.MapControllerRoute(name: "LoginUseCoce", pattern: "/user/groups",
|
||||||
defaults: new { controller = "Coce", action = "ListGroups" });
|
defaults: new
|
||||||
|
{
|
||||||
|
controller = "Coce",
|
||||||
|
action = "ListGroups"
|
||||||
|
});
|
||||||
builder.MapControllerRoute(name: "LoginUseCoce", pattern: "/auth/config",
|
builder.MapControllerRoute(name: "LoginUseCoce", pattern: "/auth/config",
|
||||||
defaults: new { controller = "Coce", action = "GetConfig" });
|
defaults: new
|
||||||
|
{
|
||||||
|
controller = "Coce",
|
||||||
|
action = "GetConfig"
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user