AppServer.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Microsoft.AspNetCore.Authentication.JwtBearer;
  2. using Microsoft.IdentityModel.Tokens;
  3. using RunnersMeet.Server.Persistence;
  4. namespace RunnersMeet.Server;
  5. public class AppServer
  6. {
  7. public void Start(string[] args)
  8. {
  9. var builder = WebApplication.CreateBuilder(args);
  10. ConfigureServices(builder.Services, builder.Configuration);
  11. builder.Services.AddControllers().AddJsonOptions(options =>
  12. {
  13. options.JsonSerializerOptions.Converters.Add(new ObjectIdConverter());
  14. });
  15. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  16. builder.Services.AddEndpointsApiExplorer();
  17. builder.Services.AddSwaggerGen();
  18. builder.Services.AddCors(options =>
  19. {
  20. options.AddDefaultPolicy(policy =>
  21. {
  22. policy.WithOrigins("http://localhost:4200");
  23. policy.WithHeaders("Authorization");
  24. });
  25. });
  26. var authOptions = new AuthOptions();
  27. builder.Configuration.GetSection("Auth").Bind(authOptions);
  28. builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  29. .AddJwtBearer(options =>
  30. {
  31. options.Authority = authOptions.Authority;
  32. options.TokenValidationParameters = new TokenValidationParameters
  33. {
  34. ValidIssuer = authOptions.Authority,
  35. ValidAudience = authOptions.Audience
  36. };
  37. });
  38. builder.Services.AddAuthorization(authorizationOptions =>
  39. {
  40. foreach (var policyPair in authOptions.PolicyClaims)
  41. {
  42. authorizationOptions.AddPolicy(policyPair.Key, policyBuilder => policyBuilder.RequireClaim("permissions", policyPair.Value));
  43. }
  44. });
  45. var app = builder.Build();
  46. // Configure the HTTP request pipeline.
  47. if (app.Environment.IsDevelopment())
  48. {
  49. app.UseSwagger();
  50. app.UseSwaggerUI();
  51. }
  52. app.UseHttpsRedirection();
  53. app.UseCors();
  54. app.UseAuthorization();
  55. app.MapControllers();
  56. app.Run();
  57. }
  58. private void ConfigureServices(IServiceCollection services, IConfigurationRoot config)
  59. {
  60. services.AddSingleton<IDatabase, Database>();
  61. services.AddSingleton<IFileStorage, FileStorage>();
  62. services.AddScoped<QueryFactory, QueryFactory>();
  63. services.Configure<PersistenceOptions>(config.GetSection(PersistenceOptions.Persistence));
  64. services.AddTransient<IPersistenceOptions, PersistenceOptionsAccessor>();
  65. }
  66. }