新的配置方式,新的SimApiStorage,移除了SimApiUPload
This commit is contained in:
+154
-152
@@ -3,188 +3,190 @@ using SimApi.Helpers;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.OpenApi.Models;
|
||||
using Swashbuckle.AspNetCore.SwaggerUI;
|
||||
using SimApi.Middlewares;
|
||||
using Microsoft.AspNetCore.HttpOverrides;
|
||||
using SimApi.Configs;
|
||||
|
||||
namespace SimApi
|
||||
{
|
||||
/// <summary>
|
||||
/// 加入系统的扩展信息
|
||||
/// </summary>
|
||||
public static class Extensions
|
||||
public static class SimApiExtensions
|
||||
{
|
||||
public static string DocumentTitle = "";
|
||||
public static string DocumentDescription = "";
|
||||
|
||||
//**********快捷添加**************
|
||||
|
||||
/// <summary>
|
||||
/// 添加整个SimAPI,同时增加CORS规则
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title"></param>
|
||||
/// <param name="description"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddSimApi(this IServiceCollection builder, string title,
|
||||
string description = null)
|
||||
public static IServiceCollection AddSimApi(this IServiceCollection builder,
|
||||
Action<SimApiOptions> options = null)
|
||||
{
|
||||
return builder.AddSimApiAuth().AddSimApiDoc(title, description).AddCors().AddSimApiUpload().Configure<ForwardedHeadersOptions>(options =>
|
||||
var simApiOptions = new SimApiOptions();
|
||||
options?.Invoke(simApiOptions);
|
||||
|
||||
// 是否使用SIMAUTH
|
||||
if (simApiOptions.EnableSimApiAuth)
|
||||
{
|
||||
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
|
||||
ForwardedHeaders.XForwardedProto;
|
||||
// Only loopback proxies are allowed by default.
|
||||
// Clear that restriction because forwarders are enabled by explicit
|
||||
// configuration.
|
||||
options.KnownNetworks.Clear();
|
||||
options.KnownProxies.Clear();
|
||||
}); ;
|
||||
builder.AddScoped<SimApiAuth>();
|
||||
}
|
||||
|
||||
// 使用SimApiDoc
|
||||
if (simApiOptions.EnableSimApiDoc)
|
||||
{
|
||||
var docOptions = simApiOptions.SimApiDocOptions;
|
||||
builder.AddSwaggerGen(x =>
|
||||
{
|
||||
foreach (var group in docOptions.ApiGroups)
|
||||
{
|
||||
x.SwaggerDoc(group.Id, new OpenApiInfo {Title = group.Name, Description = group.Description});
|
||||
}
|
||||
|
||||
x.EnableAnnotations();
|
||||
var haveOauth = false;
|
||||
var haveSimApiAuth = false;
|
||||
var oauthFlows = new OpenApiOAuthFlows();
|
||||
foreach (var auth in docOptions.ApiAuth.Type)
|
||||
{
|
||||
switch (auth)
|
||||
{
|
||||
case "SimApiAuth":
|
||||
x.AddSecurityRequirement(new OpenApiSecurityRequirement
|
||||
{
|
||||
{
|
||||
new OpenApiSecurityScheme
|
||||
{
|
||||
Reference = new OpenApiReference
|
||||
{Type = ReferenceType.SecurityScheme, Id = "HeaderToken"}
|
||||
},
|
||||
new[] {"readAccess", "writeAccess"}
|
||||
}
|
||||
});
|
||||
haveSimApiAuth = true;
|
||||
break;
|
||||
case "ClientCredentials":
|
||||
oauthFlows.ClientCredentials = new OpenApiOAuthFlow
|
||||
{
|
||||
TokenUrl = new Uri(docOptions.ApiAuth.TokenUrl, UriKind.RelativeOrAbsolute),
|
||||
Scopes = docOptions.ApiAuth.Scopes
|
||||
};
|
||||
haveOauth = true;
|
||||
break;
|
||||
case "Implicit":
|
||||
oauthFlows.Implicit = new OpenApiOAuthFlow
|
||||
{
|
||||
AuthorizationUrl = new Uri(docOptions.ApiAuth.AuthorizationUrl,
|
||||
UriKind.RelativeOrAbsolute),
|
||||
Scopes = docOptions.ApiAuth.Scopes
|
||||
};
|
||||
haveOauth = true;
|
||||
break;
|
||||
case "AuthorizationCode":
|
||||
oauthFlows.AuthorizationCode = new OpenApiOAuthFlow
|
||||
{
|
||||
TokenUrl = new Uri(docOptions.ApiAuth.TokenUrl, UriKind.RelativeOrAbsolute),
|
||||
AuthorizationUrl = new Uri(docOptions.ApiAuth.AuthorizationUrl,
|
||||
UriKind.RelativeOrAbsolute),
|
||||
Scopes = docOptions.ApiAuth.Scopes
|
||||
};
|
||||
haveOauth = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (haveOauth)
|
||||
{
|
||||
x.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
|
||||
{
|
||||
Type = SecuritySchemeType.OAuth2,
|
||||
Flows = oauthFlows,
|
||||
Description = docOptions.ApiAuth.Description,
|
||||
In = ParameterLocation.Header
|
||||
});
|
||||
x.AddSecurityRequirement(new OpenApiSecurityRequirement
|
||||
{
|
||||
{
|
||||
new OpenApiSecurityScheme
|
||||
{
|
||||
Reference = new OpenApiReference
|
||||
{Type = ReferenceType.SecurityScheme, Id = "oauth2"}
|
||||
},
|
||||
new[] {"SimApiAuth"}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (haveSimApiAuth)
|
||||
{
|
||||
x.AddSecurityDefinition("HeaderToken",
|
||||
new OpenApiSecurityScheme {Name = "Token", In = ParameterLocation.Header});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 使用Header转发,应对代理后获取真实ip
|
||||
if (simApiOptions.EnableForwardHeaders)
|
||||
{
|
||||
builder.Configure<ForwardedHeadersOptions>(options =>
|
||||
{
|
||||
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
|
||||
ForwardedHeaders.XForwardedProto;
|
||||
options.KnownNetworks.Clear();
|
||||
options.KnownProxies.Clear();
|
||||
});
|
||||
}
|
||||
|
||||
if (simApiOptions.EnableLowerUrl)
|
||||
{
|
||||
builder.AddRouting(options => options.LowercaseUrls = true);
|
||||
}
|
||||
|
||||
if (simApiOptions.EnableSimApiStorage)
|
||||
{
|
||||
builder.AddSingleton<SimApiStorage>();
|
||||
}
|
||||
|
||||
builder.AddSingleton(simApiOptions);
|
||||
return builder;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用所有SimApi自定义中间件
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title"></param>
|
||||
/// <param name="staticFileroot"></param>
|
||||
/// <param name="submitMethods"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApi(this IApplicationBuilder builder, params SubmitMethod[] submitMethods)
|
||||
public static IApplicationBuilder UseSimApi(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseSimApiException().UseSimApiDoc(submitMethods).UseMiddleware<SimApiAuthMiddleware>().UseCors(x => x.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()).UseSimApiUpload().UseForwardedHeaders();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//*********组件快捷方式*************
|
||||
|
||||
/// <summary>
|
||||
/// 添加自定义授权认证中间价
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddSimApiAuth(this IServiceCollection builder)
|
||||
{
|
||||
return builder.AddScoped<SimApiAuth>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加Base64上传组件
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddSimApiUpload(this IServiceCollection builder)
|
||||
{
|
||||
return builder.AddSingleton<SimApiUpload>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加Api文档服务
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title">文档标题</param>
|
||||
/// <param name="description">文档描述</param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddSimApiDoc(this IServiceCollection builder, string title,
|
||||
string description = null)
|
||||
{
|
||||
DocumentTitle = title;
|
||||
DocumentDescription = description;
|
||||
return builder.AddSwaggerGen(x =>
|
||||
var options = builder.ApplicationServices.GetService<SimApiOptions>();
|
||||
if (options.EnableSimApiAuth)
|
||||
{
|
||||
x.SwaggerDoc("api", new OpenApiInfo { Title = DocumentTitle, Description = DocumentDescription });
|
||||
x.EnableAnnotations();
|
||||
x.AddSecurityRequirement(new OpenApiSecurityRequirement
|
||||
builder.UseMiddleware<SimApiAuthMiddleware>();
|
||||
}
|
||||
|
||||
if (options.EnableSimApiDoc)
|
||||
{
|
||||
var docOptions = options.SimApiDocOptions;
|
||||
return builder.UseSwagger(x => x.RouteTemplate = "/swagger/{documentName}.json").UseSwaggerUI(x =>
|
||||
{
|
||||
x.DocumentTitle = docOptions.DocumentTitle;
|
||||
foreach (var group in docOptions.ApiGroups)
|
||||
{
|
||||
new OpenApiSecurityScheme
|
||||
{
|
||||
Reference = new OpenApiReference {Type = ReferenceType.SecurityScheme, Id = "HeaderToken"}
|
||||
},
|
||||
new[] {"readAccess", "writeAccess"}
|
||||
x.SwaggerEndpoint($"/swagger/{group.Id}.json", name: group.Name);
|
||||
}
|
||||
|
||||
x.EnableValidator();
|
||||
x.SupportedSubmitMethods(docOptions.SupportedMethod);
|
||||
x.DisplayRequestDuration();
|
||||
});
|
||||
x.AddSecurityDefinition("HeaderToken",
|
||||
new OpenApiSecurityScheme { Name = "Token", In = ParameterLocation.Header });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 使用异常中间价扩展
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApiException(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseMiddleware<SimApiExceptionMiddleware>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 配置上传组件必须
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApiUpload(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseStaticFiles(new StaticFileOptions
|
||||
if (options.EnableSimApiException)
|
||||
{
|
||||
DefaultContentType = "application/x-msdownload",
|
||||
ServeUnknownFileTypes = true
|
||||
});
|
||||
}
|
||||
builder.UseMiddleware<SimApiExceptionMiddleware>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用文档UI
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title">文档标题</param>
|
||||
/// <param name="submitMethods">文档支持的提交方式(如果不指定,默认使用POST)</param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApiDoc(this IApplicationBuilder builder, params SubmitMethod[] submitMethods)
|
||||
{
|
||||
return builder.UseSwagger(x => x.RouteTemplate = "docs/{documentName}.json").UseSwaggerUI(x =>
|
||||
if (options.EnableForwardHeaders)
|
||||
{
|
||||
x.RoutePrefix = "docs";
|
||||
x.DocumentTitle = DocumentTitle;
|
||||
x.SwaggerEndpoint("/docs/api.json", name: DocumentTitle);
|
||||
x.EnableValidator();
|
||||
if (submitMethods.Length > 0)
|
||||
{
|
||||
x.SupportedSubmitMethods(submitMethods);
|
||||
}
|
||||
else
|
||||
{
|
||||
x.SupportedSubmitMethods(SubmitMethod.Post);
|
||||
}
|
||||
builder.UseForwardedHeaders();
|
||||
}
|
||||
|
||||
x.DisplayRequestDuration();
|
||||
});
|
||||
return builder;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 同时使用Api文档和异常处理中间件
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title">文档标题</param>
|
||||
/// <param name="submitMethods">API提交方式定义</param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApiDocEx(this IApplicationBuilder builder, params SubmitMethod[] submitMethods)
|
||||
{
|
||||
return builder.UseSimApiException().UseSimApiDoc(submitMethods);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用自定义认证中间件(依赖IDistributedCache)
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApiAuth(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseMiddleware<SimApiAuthMiddleware>();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user