网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using System.Net;
using AgileConfig.Client;
using Dpz.Core.Auth;
using Dpz.Core.Auth.Middleware;
using Dpz.Core.Auth.Security;
using Dpz.Core.Auth.Service;
using Dpz.Core.Infrastructure;
using Dpz.Core.Infrastructure.Configuration;
using Dpz.Core.Service;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.KeyManagement;
using Microsoft.AspNetCore.HttpOverrides;
using Serilog;

Log.Logger = new LoggerConfiguration().Enrich.FromLogContext().CreateBootstrapLogger();
try
{
    var builder = WebApplication.CreateBuilder(args);
    builder.Host.UseAgileConfig(new ConfigClient(builder.Configuration));

    var services = builder.Services;
    var configuration = builder.Configuration;

    var logSeq = configuration.GetSection("LogSeq").Get<LogSeq>();
    builder.Host.ConfigurationLog(logSeq);

    services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders =
            ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
        // Docker 网桥
        options.KnownIPNetworks.Add(new(IPAddress.Parse("172.17.0.0"), 16));
        // 显式信任单个代理 IP(避免 IPv6 映射问题)
        options.KnownProxies.Add(IPAddress.Parse("172.17.0.1"));
    });

    const string originsName = "ConfigurationOrigins";
    services.AddCors(options =>
    {
        options.AddPolicy(
            originsName,
            cfg =>
            {
                var origins = configuration.GetSection("Origins").Get<string[]>();
                if (origins is { Length: > 0 })
                {
                    cfg.WithOrigins(origins).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
                }
            }
        );
    });

    #region register inject
    services.AddBusinessServices(configuration);
    services.AddDefaultServices(configuration);
    services.AddHttpClient("edge");
    services.AddScoped<IPinCodeValidator, PinCodeValidator>();

    #endregion

    services.AddOidc(configuration);
    const string appName = "Dpz.Core.Auth";
    services.AddDataProtection().SetApplicationName(appName);
    services
        .AddOptions<KeyManagementOptions>()
        .Configure<IServiceScopeFactory>(
            (options, factory) =>
            {
                options.XmlRepository = new XmlRepositoryService(factory, appName + ".Key");
            }
        );

    services.AddControllersWithViews();

    services.AddPermissionAuthorization();

    var app = builder.Build();

    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseForwardedHeaders();

    app.Use(
        async (context, next) =>
        {
            var sessionId = context.Request.Cookies["SessionId"];
            if (string.IsNullOrWhiteSpace(sessionId))
            {
                context.Response.Cookies.Append(
                    "SessionId",
                    Guid.NewGuid().ToString(),
                    new CookieOptions
                    {
                        HttpOnly = true,
                        Secure = true,
                        SameSite = SameSiteMode.Strict,
                        IsEssential = true,
                        Expires = DateTimeOffset.Now.AddYears(1),
                    }
                );
            }
            await next.Invoke();
        }
    );

    await app.UseRegisterInitApplicationAsync();

    app.UseSerilogRequestLogging();

    // app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseCors(originsName);

    app.UseAuthentication();
    // 添加SecurityStamp验证中间件
    app.UseSecurityStampValidation();
    app.UseAuthorization();

    app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
    app.MapGet(
        "/ping",
        requestDelegate: async context =>
        {
            await context.Response.WriteAsJsonAsync(context.Request.Headers);
        }
    );

    app.Run();
}
catch (Exception e)
{
    Console.Error.WriteLine(e);
    Log.Fatal(e, "Host terminated unexpectedly");
}
finally
{
    Log.CloseAndFlush();
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码是一个 ASP.NET Core 应用程序的启动代码,主要用于配置和初始化 Web 应用程序的服务和中间件。以下是代码的主要功能和结构的详细解释:

1. 日志配置

Log.Logger = new LoggerConfiguration().Enrich.FromLogContext().CreateBootstrapLogger();
  • 使用 Serilog 进行日志记录的配置,创建一个引导日志记录器。

2. 创建 Web 应用程序构建器

var builder = WebApplication.CreateBuilder(args);
  • 创建一个 Web 应用程序的构建器,接收命令行参数。

3. 配置 AgileConfig

builder.Host.UseAgileConfig(new ConfigClient(builder.Configuration));
  • 使用 AgileConfig 进行配置管理,允许从配置中心获取配置信息。

4. 日志序列配置

var logSeq = configuration.GetSection("LogSeq").Get<LogSeq>();
builder.Host.ConfigurationLog(logSeq);
  • 从配置中获取日志序列信息并进行配置。

5. 配置转发头

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.17.0.0"), 16));
    options.KnownProxies.Add(IPAddress.Parse("172.17.0.1"));
});
  • 配置转发头,以支持在代理后面运行的应用程序,允许识别原始请求的 IP 地址和协议。

6. CORS 策略

const string originsName = "ConfigurationOrigins";
services.AddCors(options =>
{
    options.AddPolicy(
        originsName,
        cfg =>
        {
            var origins = configuration.GetSection("Origins").Get<string[]>();
            if (origins is { Length: > 0 })
            {
                cfg.WithOrigins(origins).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
            }
        }
    );
});
  • 配置跨源资源共享 (CORS) 策略,允许来自特定来源的请求。

7. 注册服务

services.AddBusinessServices(configuration);
services.AddDefaultServices(configuration);
services.AddHttpClient("edge");
services.AddScoped<IPinCodeValidator, PinCodeValidator>();
  • 注册业务服务、默认服务和 HTTP 客户端。

8. OIDC 和数据保护

services.AddOidc(configuration);
const string appName = "Dpz.Core.Auth";
services.AddDataProtection().SetApplicationName(appName);
  • 配置 OpenID Connect (OIDC) 和数据保护服务。

9. 控制器和权限授权

services.AddControllersWithViews();
services.AddPermissionAuthorization();
  • 添加 MVC 控制器支持和权限授权服务。

10. 构建应用程序

var app = builder.Build();
  • 构建应用程序。

11. 中间件配置

  • 异常处理和 HSTS:

    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    
    • 在生产环境中使用异常处理和 HTTP 严格传输安全 (HSTS)。
  • 转发头:

    app.UseForwardedHeaders();
    
  • 会话 ID 管理:

    app.Use(
        async (context, next) =>
        {
            var sessionId = context.Request.Cookies["SessionId"];
            if (string.IsNullOrWhiteSpace(sessionId))
            {
                context.Response.Cookies.Append(
                    "SessionId",
                    Guid.NewGuid().ToString(),
                    new CookieOptions
                    {
                        HttpOnly = true,
                        Secure = true,
                        SameSite = SameSiteMode.Strict,
                        IsEssential = true,
                        Expires = DateTimeOffset.Now.AddYears(1),
                    }
                );
            }
            await next.Invoke();
        }
    );
    
    • 检查请求中是否存在会话 ID,如果不存在则生成一个新的会话 ID。
  • 注册初始化应用程序:

    await app.UseRegisterInitApplicationAsync();
    
  • 请求日志记录:

    app.UseSerilogRequestLogging();
    
  • 静态文件和路由:

    app.UseStaticFiles();
    app.UseRouting();
    
  • CORS、身份验证和授权:

    app.UseCors(originsName
    
loading