using System.Reflection; using System.Security.Claims; using System.Text; using AGSS.DbSet; using AGSS.Models; using AGSS.Models.Entities; using AGSS.Models.Template; using AGSS.Services; using AGSS.Utilities; using asg_form; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; var builder = WebApplication.CreateBuilder(args); var configuration=builder.Configuration; var domain = builder.Configuration["Auth0:Domain"]; var audience = builder.Configuration["Auth0:Audience"]; builder.Services.AddCors(options => { options.AddPolicy("AllowAll", builder => { builder.AllowAnyOrigin() // 允许所有来源 .AllowAnyHeader() .AllowAnyMethod(); }); }); // 数据库配置(PGSQL) builder.Services.AddDbContext(opt => opt.UseNpgsql(builder.Configuration.GetConnectionString("DBContext"))); // Identity 配置 builder.Services.AddIdentityCore(options => { options.Password.RequireDigit = false; options.Password.RequireLowercase = false; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequiredLength = 6; options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider; options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider; }) .AddRoles() .AddEntityFrameworkStores() .AddDefaultUI() ; // 注册 UserService // builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.Configure(options => { options.TokenValidationParameters.RoleClaimType = ClaimTypes.Role; }); builder.Services.Configure(builder.Configuration.GetSection("JWT")); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(x => { var jwtOpt = builder.Configuration.GetSection("JWT").Get(); byte[] keyBytes = Encoding.UTF8.GetBytes(jwtOpt.SigningKey); var secKey = new SymmetricSecurityKey(keyBytes); x.TokenValidationParameters = new() { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = secKey }; }) .AddCookie("Identity.External").AddCookie("Identity.Application"); builder.Services.AddAuthorization(); builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "ZeroNode后端文档", Version = "1.0.0", Description = "使用了Dotnet9.0,数据库采用PGSql,作者:罗澜,7000" }); var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, Description = "直接在下框中输入Bearer {token}(注意两者之间是一个空格)", Name = "Authorization", BearerFormat = "JWT", Scheme = "Bearer" }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[] { } } }); }); var app = builder.Build(); app.UseCors("AllowAll"); // 配置Swagger app.UseSwagger(); app.UseSwaggerUI(); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); // 自定义中间件 把404变成200 app.Use(async (context, next) => { await next(); // 先执行后续中间件 // 如果响应是 404 且未修改过 if (context.Response.StatusCode == 404 && !context.Response.HasStarted) { context.Response.StatusCode = 200; // 改为 200 context.Response.ContentType = "application/json"; // 自定义响应内容 await context.Response.WriteAsJsonAsync(new ReturnTemplate(404, "未能找到资源吖!", null!)); } }); // 控制器路由 app.MapControllers(); app.MapRazorPages(); app.Run();