forked from xiongyuxing/tiku-backend.net
78 lines
2.6 KiB
C#
78 lines
2.6 KiB
C#
using Microsoft.Extensions.Configuration;
|
|
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('/'));
|
|
}
|
|
}
|