using System.Text; using System.Threading.RateLimiting; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.RateLimiting; using Microsoft.IdentityModel.Tokens; using SupplierManager.Common; using SupplierManager.Models; namespace SupplierManager { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddScoped(); builder.Services.AddCors(options => { options.AddPolicy(name: "Vue3", policy => { //policy.WithOrigins("http://localhost:5180", // "http://localhost:8809/", // "http://www.contoso.com", // "http://new.uts-data.com:6688/", "http://new.uts-data.com") policy .AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); }); //builder.Services.AddRateLimiter(options => //{ // options.AddTokenBucketLimiter(policyName: "token_bucket", tokenBucketOptions => // { // tokenBucketOptions.TokenLimit = 100;//桶最多可以装的令牌数,发放的多余令牌会被丢弃 // tokenBucketOptions.ReplenishmentPeriod = TimeSpan.FromSeconds(10);//令牌发放周期 // tokenBucketOptions.TokensPerPeriod = 100;//每个周期发放令牌数 // tokenBucketOptions.QueueLimit = 90;//当桶内的令牌全部被拿完(token=0)时,后续请求会进入排队 // tokenBucketOptions.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; // tokenBucketOptions.AutoReplenishment = true;//进入新令牌发放周期,是否自动发放令牌。如果设置为false,则需要手动调用 TokenBucketRateLimiter.TryReplenish来发放 // }); //}); builder.Services.AddAuthorization(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(option => { string DefaultKey = "B,EZipeApY3cNj3~4RP0UMR=H>9x8.1!E85wmZ]]py2d$Y?5"; var sec = Encoding.UTF8.GetBytes(builder.Configuration["JWT:SecretKey"] ?? DefaultKey); option.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters() { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["JwT:Issuer"], ValidAudience = builder.Configuration["JwT:Audience"], IssuerSigningKey = new SymmetricSecurityKey(sec) }; option.Events = new JwtBearerEvents { OnMessageReceived = context => { var token = context.Request.Headers["token"].FirstOrDefault(); if (string.IsNullOrEmpty(token)) { // 如果没有找到 token 头部,则继续检查 Authorization 头部 token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last(); } // 如果找到了 token,则将其设置到 HttpContext 中 if (!string.IsNullOrEmpty(token)) { context.Token = token; } return Task.CompletedTask; } }; }); var app = builder.Build(); // Configure the HTTP request pipeline. app.UseCors("Vue3"); app.UseAuthentication(); // 添加认证中间件 app.UseAuthorization(); // 使用授权中间件 app.UseStaticFiles(); app.MapControllers(); //app.UseRateLimiter(new Microsoft.AspNetCore.RateLimiting.RateLimiterOptions() //{ // RejectionStatusCode = 500 //}); StaticData.GetWebAPIMethod(); app.Run(); } } }