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
3 weeks ago
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|