You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
6.0 KiB
144 lines
6.0 KiB
using medical.insu.transfomer.Attributes; |
|
using ReZero.SuperAPI; |
|
using System; |
|
using System.Linq; |
|
using System.Reflection; |
|
|
|
namespace medical.insu.transfomer |
|
{ |
|
/// <summary> |
|
/// 定义不需要登录验证的API路径 |
|
/// </summary> |
|
public static class NoAuthPaths |
|
{ |
|
/// <summary> |
|
/// 医保交易接口 |
|
/// </summary> |
|
public const string MedicalInsuranceExecuteTransaction = "/api/200100/medicalinsurancecontroller/executetransaction"; |
|
|
|
/// <summary> |
|
/// 检查路径是否在免验证列表中 |
|
/// </summary> |
|
/// <param name="path">请求路径</param> |
|
/// <returns>true表示不需要验证</returns> |
|
public static bool IsNoAuthPath(string path) |
|
{ |
|
path = path.ToLower(); |
|
|
|
// 检查是否匹配医保交易接口 |
|
if (path.Contains(MedicalInsuranceExecuteTransaction)) |
|
{ |
|
Console.WriteLine($"路径匹配医保交易接口: {path}"); |
|
return true; |
|
} |
|
|
|
// 如果需要添加更多免验证路径,可以在这里扩展 |
|
|
|
// 添加更多需要跳过验证的接口 |
|
if (path.Contains("/api/200100/medicalinsurancecontroller/")) |
|
{ |
|
Console.WriteLine($"所有医保接口跳过验证: {path}"); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
/// <summary> |
|
/// 通过特性检查是否需要验证 |
|
/// </summary> |
|
/// <param name="context">接口上下文</param> |
|
/// <returns>true表示不需要验证</returns> |
|
public static bool IsSkipAuthByAttribute(InterfaceContext context) |
|
{ |
|
var path = context.HttpContext.Request.Path; |
|
Console.WriteLine($"检查路径是否需要验证: {path}"); |
|
|
|
// 先检查路径 |
|
if (IsNoAuthPath(path)) |
|
{ |
|
Console.WriteLine($"路径已跳过验证: {path}"); |
|
return true; |
|
} |
|
|
|
try |
|
{ |
|
// 检查具体接口信息 |
|
if (context.InterfaceInfo?.DataModel?.MyMethodInfo != null) |
|
{ |
|
var methodInfo = context.InterfaceInfo.DataModel.MyMethodInfo; |
|
var classFullName = methodInfo.MethodClassFullName; |
|
var methodName = methodInfo.MethodName; |
|
|
|
Console.WriteLine($"检查接口信息: {classFullName}.{methodName}"); |
|
|
|
if (!string.IsNullOrEmpty(classFullName) && !string.IsNullOrEmpty(methodName)) |
|
{ |
|
// 获取所有程序集 |
|
var assemblies = AppDomain.CurrentDomain.GetAssemblies(); |
|
|
|
foreach (var assembly in assemblies) |
|
{ |
|
try |
|
{ |
|
// 查找类型 |
|
if (!assembly.FullName.Contains("medical") && |
|
!assembly.FullName.Contains("SuperAPI")) |
|
continue; |
|
|
|
var type = assembly.GetType(classFullName); |
|
if (type != null) |
|
{ |
|
Console.WriteLine($"找到类型: {type.FullName}"); |
|
|
|
// 检查类是否有SkipAuthAttribute |
|
if (type.GetCustomAttributes(typeof(SkipAuthAttribute), true).Any()) |
|
{ |
|
Console.WriteLine($"类型有SkipAuthAttribute: {type.FullName}"); |
|
return true; |
|
} |
|
|
|
// 查找方法 |
|
var method = type.GetMethod(methodName); |
|
if (method != null) |
|
{ |
|
Console.WriteLine($"找到方法: {method.Name}"); |
|
|
|
// 检查方法是否有SkipAuthAttribute |
|
if (method.GetCustomAttributes(typeof(SkipAuthAttribute), true).Any()) |
|
{ |
|
Console.WriteLine($"方法有SkipAuthAttribute: {method.Name}"); |
|
return true; |
|
} |
|
} |
|
else |
|
{ |
|
Console.WriteLine($"找不到方法: {methodName}"); |
|
} |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
// 忽略查找过程中的异常 |
|
Console.WriteLine($"查找程序集时发生异常: {assembly.FullName}, 错误: {ex.Message}"); |
|
continue; |
|
} |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
Console.WriteLine("接口信息为空"); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
// 捕获任何异常,防止验证过程崩溃 |
|
Console.WriteLine($"检查免验证特性时发生异常: {ex.Message}, 堆栈: {ex.StackTrace}"); |
|
} |
|
|
|
Console.WriteLine($"需要验证: {path}"); |
|
return false; |
|
} |
|
} |
|
} |