Files
tiku-backend.net/Tiku.Api/Options/OptionsValidation.cs
xiong c497a3ca8d
Some checks failed
ci / release-gate (push) Has been cancelled
清理代码
2026-08-03 12:31:39 +08:00

64 lines
2.5 KiB
C#

using System.Net;
using Tiku.Application.Security;
namespace Tiku.Api.Options;
public static class OptionsValidation
{
public static string ResolveDatabaseConnectionString(
IConfiguration configuration,
bool isDevelopment)
{
var connectionString =
configuration.GetConnectionString("Database") ??
configuration["DATABASE_URL"];
if (!string.IsNullOrWhiteSpace(connectionString)) return connectionString;
if (isDevelopment) return $"Host=localhost;Database=tiku;Username={Environment.UserName}";
throw new InvalidOperationException(
"Database connection is required outside Development. Configure ConnectionStrings:Database or DATABASE_URL.");
}
public static bool BeValidJwtOptions(JwtOptions options, bool isProduction)
{
return JwtOptions.BeValid(options, isProduction);
}
public static bool BeValidCorsOptions(CorsOptions options)
{
if (options.AllowCredentials && options.AllowedOrigins.Length == 0) return false;
return options.AllowedOrigins.All(IsHttpOrigin);
}
public static bool BeValidTenantResolutionOptions(
TenantResolutionOptions options,
IConfiguration configuration,
bool isProduction)
{
if (!isProduction) return true;
var platformHosts = options.PlatformHosts
.Where(host => !string.IsNullOrWhiteSpace(host))
.Select(host => host.Trim())
.ToArray();
var hasFormalHost = platformHosts.Any(host =>
!string.Equals(host, "localhost", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(host, "127.0.0.1", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(host, "::1", StringComparison.OrdinalIgnoreCase));
var allowedHosts = configuration["AllowedHosts"];
return hasFormalHost &&
options.TrustedProxyAddresses.Any(address => IPAddress.TryParse(address, out _)) &&
!string.IsNullOrWhiteSpace(allowedHosts) &&
!allowedHosts.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Contains("*", StringComparer.Ordinal);
}
private static bool IsHttpOrigin(string origin)
{
return Uri.TryCreate(origin, UriKind.Absolute, out var uri) &&
(uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps) &&
string.IsNullOrEmpty(uri.PathAndQuery.Trim('/'));
}
}