网站首页 网站源码
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();
}
这段代码是一个 ASP.NET Core 应用程序的启动代码,主要用于配置和初始化 Web 应用程序的服务和中间件。以下是代码的主要功能和结构的详细解释:
Log.Logger = new LoggerConfiguration().Enrich.FromLogContext().CreateBootstrapLogger();
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseAgileConfig(new ConfigClient(builder.Configuration));
var logSeq = configuration.GetSection("LogSeq").Get<LogSeq>();
builder.Host.ConfigurationLog(logSeq);
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"));
});
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();
}
}
);
});
services.AddBusinessServices(configuration);
services.AddDefaultServices(configuration);
services.AddHttpClient("edge");
services.AddScoped<IPinCodeValidator, PinCodeValidator>();
services.AddOidc(configuration);
const string appName = "Dpz.Core.Auth";
services.AddDataProtection().SetApplicationName(appName);
services.AddControllersWithViews();
services.AddPermissionAuthorization();
var app = builder.Build();
异常处理和 HSTS:
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
转发头:
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();
}
);
注册初始化应用程序:
await app.UseRegisterInitApplicationAsync();
请求日志记录:
app.UseSerilogRequestLogging();
静态文件和路由:
app.UseStaticFiles();
app.UseRouting();
CORS、身份验证和授权:
app.UseCors(originsName
