This commit is contained in:
2025-05-14 06:26:10 +08:00
parent 4ae72d2e6b
commit 87fda473d3
7 changed files with 83 additions and 22 deletions
+4 -4
View File
@@ -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 -3
View File
@@ -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>
+1 -1
View File
@@ -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)
{ {
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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"
});
} }
} }