diff --git a/SimApi.csproj b/SimApi.csproj index c50873a..7cdd064 100644 --- a/SimApi.csproj +++ b/SimApi.csproj @@ -23,8 +23,8 @@ - - + + diff --git a/SimApiExtensions.cs b/SimApiExtensions.cs index b48dfdf..d9c1235 100644 --- a/SimApiExtensions.cs +++ b/SimApiExtensions.cs @@ -124,7 +124,42 @@ public static class SimApiExtensions }); } - x.CustomSchemaIds(type => type.FullName?.Replace("+", ".")); + x.CustomSchemaIds(type => + { + string GetSimpleTypeName(Type t) + { + if (t.IsArray) + { + var elementType = t.GetElementType(); + return $"{GetSimpleTypeName(elementType)}[]"; + } + + if (t.IsPrimitive || t == typeof(string) || t == typeof(DateTime) || t == typeof(Guid)) + { + return t.Name switch + { + "String" => "string", + "Int32" => "int", + "Int64" => "long", + "Boolean" => "boolean", + "DateTime" => "DateTime", + "Guid" => "Guid", + _ => t.Name + }; + } + + return t.Name; + } + + if (!type.IsGenericType) return GetSimpleTypeName(type); + var baseName = type.GetGenericTypeDefinition().Name.Split('`')[0]; + var genericArgs = type.GetGenericArguments() + .Select(GetSimpleTypeName) + .ToArray(); + return genericArgs.Length > 0 + ? $"{baseName}<{string.Join(",", genericArgs)}>" + : baseName; + }); x.OperationFilter(); x.OperationFilter(); x.OperationFilter(); @@ -159,19 +194,13 @@ public static class SimApiExtensions switch (auth) { case "SimApiAuth": - x.AddSecurityDefinition("HeaderToken", + x.AddSecurityDefinition("SimApiAuth", new OpenApiSecurityScheme { Name = "Token", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey }); - x.AddSecurityRequirement(docs => new OpenApiSecurityRequirement - { - { - new OpenApiSecuritySchemeReference("HeaderToken"), new List() - } - }); break; case "ClientCredentials": oauthFlows.ClientCredentials = new OpenApiOAuthFlow @@ -220,12 +249,6 @@ public static class SimApiExtensions Description = docOptions.ApiAuth.Description, In = ParameterLocation.Header }); - x.AddSecurityRequirement(docs => new OpenApiSecurityRequirement - { - { - new OpenApiSecuritySchemeReference("oauth2"), new List() - } - }); } }); } diff --git a/SwaggerFilters/SimApiAuthOperationFilter.cs b/SwaggerFilters/SimApiAuthOperationFilter.cs index f5ec8ee..2872e96 100644 --- a/SwaggerFilters/SimApiAuthOperationFilter.cs +++ b/SwaggerFilters/SimApiAuthOperationFilter.cs @@ -19,22 +19,10 @@ namespace SimApi.SwaggerFilters // 控制器上有 [SimApiAuth](继承到所有方法) context.MethodInfo.DeclaringType?.GetCustomAttributes(true).Any() == true; if (!requiresAuth) return; - - // 关键修复:正确构造 OpenApiSecuritySchemeReference(匹配键类型要求) - var securitySchemeRef = new OpenApiSecuritySchemeReference( - referenceId: "SimApiAuth", // 必须与 AddSecurityDefinition 的 ID 一致 - hostDocument: null, - externalResource: null - ); - - // 给 Security 赋值(确保键类型是 OpenApiSecuritySchemeReference) operation.Security ??= new List(); - operation.Security.Add(new OpenApiSecurityRequirement + operation.Security.Add(new OpenApiSecurityRequirement() { - { - securitySchemeRef, - [] - } + { new OpenApiSecuritySchemeReference("SimApiAuth", context.Document), [] } }); } }