AGSSbackend/AGSS/Program.cs

164 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<ApplicationDbContext>(opt =>
opt.UseNpgsql(builder.Configuration.GetConnectionString("DBContext")));
// Identity 配置
builder.Services.AddIdentityCore<UserModel>(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<RoleModel>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
;
// 注册 UserService
// builder.Services.AddScoped<UserService>();
builder.Services.AddScoped<Jwt>();
builder.Services.AddScoped<UserService>();
builder.Services.AddScoped<MenuService>();
builder.Services.AddScoped<DictService>();
builder.Services.AddScoped<ICurrentUserService, CurrentUserService>();
builder.Services.Configure<JWTOptions>(builder.Configuration.GetSection("JWT"));
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(x =>
{
var jwtOpt = builder.Configuration.GetSection("JWT").Get<JWTOptions>();
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.Configure<JwtBearerOptions>(options =>
{
options.TokenValidationParameters.RoleClaimType = "role";
});
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();