// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { IConfigurationSection appSettingsSection = Configuration.GetSection("AppSettings"); AppSettings appSettings = appSettingsSection.Get <AppSettings>(); ServiceResolver.ResolveServices(services, appSettings.SqlConnectionString); services.Configure <AppSettings>(appSettingsSection); byte[] key = Encoding.ASCII.GetBytes(appSettings.JwtSecret); services.AddCors(options => options.AddPolicy("AllowAll", p => p .SetIsOriginAllowed(x => _ = true) .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials())); services.AddOpenApiDocument(document => { document.OperationProcessors.Add(new ApiVersionProcessor() { IncludedVersions = new string[] { "1.0" } }); document.DocumentName = "v1"; document.PostProcess = d => d.Info.Title = "Meetings Organizer Pro Web API v1.0 OpenAPI"; document.AddSecurity("JWT", Enumerable.Empty <string>(), new OpenApiSecurityScheme { Type = OpenApiSecuritySchemeType.ApiKey, Name = "Authorization", In = OpenApiSecurityApiKeyLocation.Header, Description = "Type into the textbox: Bearer {your JWT token}." }); document.OperationProcessors.Add( new AspNetCoreOperationSecurityScopeProcessor("JWT")); }); services.AddApiVersioning(options => { options.AssumeDefaultVersionWhenUnspecified = true; options.DefaultApiVersion = new ApiVersion(1, 0); options.ReportApiVersions = true; options.ApiVersionReader = new UrlSegmentApiVersionReader(); }); services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(x => { x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = false, ValidateAudience = false }; }); services.AddControllers(); }