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.
177 lines
7.1 KiB
177 lines
7.1 KiB
using Microsoft.AspNetCore.Authentication.JwtBearer; |
|
using Microsoft.AspNetCore.Authentication; |
|
using Microsoft.AspNetCore.Builder; |
|
using Microsoft.AspNetCore.Http; |
|
using SqlSugar; |
|
using System; |
|
using System.Linq; |
|
using System.Net; |
|
using System.Threading.Tasks; |
|
|
|
namespace ReZero.SuperAPI |
|
{ |
|
/// <summary> |
|
/// Middleware class for handling Zero Dynamic API and Internal API requests. |
|
/// </summary> |
|
public class SuperAPIMiddleware |
|
{ |
|
private readonly IApplicationBuilder _applicationBuilder; |
|
|
|
/// <summary> |
|
/// Constructor for ZeroApiMiddleware class. |
|
/// </summary> |
|
/// <param name="application">Instance of IApplicationBuilder.</param> |
|
public SuperAPIMiddleware(IApplicationBuilder application) |
|
{ |
|
_applicationBuilder = application ?? throw new ArgumentNullException(nameof(application)); |
|
} |
|
|
|
/// <summary> |
|
/// Middleware entry point to handle incoming requests. |
|
/// </summary> |
|
/// <param name="context">HttpContext for the current request.</param> |
|
/// <param name="next">Delegate representing the next middleware in the pipeline.</param> |
|
public async Task InvokeAsync(HttpContext context, Func<Task> next) |
|
{ |
|
// Get the requested URL path from the context |
|
var requestedUrl = context.Request.Path; |
|
|
|
// Check if the requested URL corresponds to Internal API |
|
if (IsInternalApi(requestedUrl)) |
|
{ |
|
// Handle the request using Internal API logic |
|
await InternalApi(context); |
|
|
|
} |
|
// Check if the requested URL corresponds to Dynamic API |
|
else if(IsDynamicApi(requestedUrl)) |
|
{ |
|
// Handle the request using Dynamic API logic |
|
await DynamicApi(context); |
|
|
|
} |
|
// If the requested URL doesn't match any specific API, pass the request to the next middleware |
|
else |
|
{ |
|
if (IsShowNativeApiDocument(requestedUrl)) |
|
{ |
|
context.Response.Redirect("/rezero/dynamic_interface.html?InterfaceCategoryId=200100"); |
|
} |
|
else |
|
{ |
|
await next(); |
|
} |
|
} |
|
} |
|
|
|
//private async Task<bool> AuthorizationHtmlAsync(HttpContext context) |
|
//{ |
|
// if (SuperAPIModule._apiOptions?.InterfaceOptions?.Jwt?.Enable != true) |
|
// { |
|
// return true; |
|
// } |
|
// var url = context.Request.Path.ToString().ToLower(); |
|
// if (url.EndsWith(".html") == true && url != PubConst.Jwt_PageUrl) |
|
// { |
|
// var authHeader = context.Request.Headers["Authorization"].FirstOrDefault(); |
|
// if (authHeader != null && authHeader.StartsWith("Bearer ")) |
|
// { |
|
// var token = authHeader.Split(' ')[1]; |
|
// try |
|
// { |
|
// // 进行JWT令牌验证,例如使用Microsoft.AspNetCore.Authentication.JwtBearer包提供的验证器 |
|
// var authResult = await context.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme); |
|
// if (authResult.Succeeded) |
|
// { |
|
// return true; |
|
// } |
|
// else |
|
// { |
|
// // 用户未通过身份验证,可能需要进行一些处理,例如返回未经授权的错误 |
|
// context.Response.StatusCode = 401; |
|
// context.Response.Redirect(PubConst.Jwt_PageUrl); |
|
// return false; |
|
// } |
|
// } |
|
// catch (Exception) |
|
// { |
|
// // JWT验证失败 |
|
// context.Response.StatusCode = 401; |
|
// context.Response.Redirect(PubConst.Jwt_PageUrl); |
|
// return false; |
|
// } |
|
// } |
|
// else |
|
// { |
|
// // Authorization标头缺失或格式不正确 |
|
// context.Response.StatusCode = 401; |
|
// context.Response.Redirect(PubConst.Jwt_PageUrl); |
|
// return false; |
|
// } |
|
// } |
|
// else |
|
// { |
|
// return true; |
|
// } |
|
//} |
|
|
|
private static bool IsShowNativeApiDocument(PathString requestedUrl) |
|
{ |
|
return requestedUrl.ToString().TrimStart('/').TrimEnd('/').ToLower() == "rezero" && SuperAPIModule._apiOptions?.UiOptions?.ShowNativeApiDocument != true; |
|
} |
|
|
|
/// <summary> |
|
/// Handles requests for Dynamic API. |
|
/// </summary> |
|
/// <param name="context">HttpContext for the current request.</param> |
|
private async Task DynamicApi(HttpContext context) |
|
{ |
|
// Get the IDynamicApi service instance from the application's service provider |
|
var app = App.ServiceProvider!.GetService<IDynamicApi>(); |
|
|
|
// Invoke the WriteAsync method to process and respond to the request |
|
await app.WriteAsync(context); |
|
} |
|
|
|
/// <summary> |
|
/// Checks if the requested URL corresponds to Dynamic API. |
|
/// </summary> |
|
/// <param name="requestedUrl">Requested URL path.</param> |
|
/// <returns>True if the URL corresponds to Dynamic API, otherwise false.</returns> |
|
private bool IsDynamicApi(PathString requestedUrl) |
|
{ |
|
// Get the IDynamicApi service instance from the application's service provider |
|
var app = App.ServiceProvider!.GetService<IDynamicApi>(); |
|
|
|
// Determine if the requested URL matches Dynamic API |
|
return app.IsApi(requestedUrl); |
|
} |
|
|
|
/// <summary> |
|
/// Handles requests for Internal API. |
|
/// </summary> |
|
/// <param name="context">HttpContext for the current request.</param> |
|
private async Task InternalApi(HttpContext context) |
|
{ |
|
// Get the InternalApi service instance from the application's service provider |
|
var app = App.ServiceProvider!.GetService<InternalApi>(); |
|
|
|
// Invoke the WriteAsync method to process and respond to the request |
|
await app.WriteAsync(context); |
|
} |
|
|
|
/// <summary> |
|
/// Checks if the requested URL corresponds to Internal API. |
|
/// </summary> |
|
/// <param name="requestedUrl">Requested URL path.</param> |
|
/// <returns>True if the URL corresponds to Internal API, otherwise false.</returns> |
|
private bool IsInternalApi(PathString requestedUrl) |
|
{ |
|
// Get the InternalApi service instance from the application's service provider |
|
var app = App.ServiceProvider!.GetService<InternalApi>(); |
|
|
|
// Determine if the requested URL matches Internal API |
|
return app.IsApi(requestedUrl); |
|
} |
|
} |
|
} |