public void ConfigureServices(IServiceCollection services) { RegisterIpRateLimitingServices(services); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => { var jwtOptions = Configuration.GetSection(nameof(JwtOptions)).Get <JwtOptions>(); options.Audience = jwtOptions.Audience; options.TokenValidationParameters.ValidateAudience = true; options.TokenValidationParameters.ValidateLifetime = true; options.RequireHttpsMetadata = false; if (IsTest) { options.TokenValidationParameters.IssuerSigningKey = JwtTestsHelper.IssuerSigningKey(jwtOptions.DebugKey); options.TokenValidationParameters.ValidateIssuer = false; options.TokenValidationParameters.ValidateIssuerSigningKey = true; } else { options.Authority = jwtOptions.Authority; } }); services.AddControllers(); services.AddDbContext <ApplicationDbContext>(options => { options.UseNpgsql(Configuration.GetConnectionString("POSTGRES"), npgsql => npgsql.MigrationsAssembly("IT-Feedback.DAL")); }); services.AddWebAppConfigure() .AddTransientConfigure <MigrationWork>(); services.AddAutoMapper(typeof(ContextDtoProfile)); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "IT Lab Feedback API", Version = "v1" }); var securityScheme = new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "Please enter into field the Sword 'Bearer' following by space and JWT", Name = "Authorization", Type = SecuritySchemeType.ApiKey }; c.AddSecurityDefinition("Bearer", securityScheme); var requirement = new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, Array.Empty <string>() } }; c.AddSecurityRequirement(requirement); }); }
public void ConfigureServices(IServiceCollection services) { services.Configure <JwtOptions>(Configuration.GetSection(nameof(JwtOptions))); services.AddControllers(); services.AddSingleton <IDbFactory, ConcurrentDictionaryDbFactory>(); services.AddTransient <EventSalaryContext>(); services.AddTransient <ReportSalaryContext>(); switch (Configuration.GetValue <EventsServiceType>(nameof(EventsServiceType))) { case EventsServiceType.SelfReferenced: services.AddScoped <IEventsService, SelfReferencedEventsService>(); break; case EventsServiceType.FromEventsApi: var options = Configuration .GetSection(nameof(RemoteApiEventsServiceOptions)) .Get <RemoteApiEventsServiceOptions>(); services.AddAccessTokenManagement(atmo => { atmo.Client.Clients.Add("identityserver", new ClientCredentialsTokenRequest { Address = options.TokenUrl, ClientId = "itlab_salary", Scope = "itlab.events", ClientSecret = options.ClientSecret }); }); services.AddClientAccessTokenClient(RemoteApiEventsService.HttpClientName, configureClient: client => { client.BaseAddress = new Uri(options.BaseUrl); }); services.AddScoped <IEventsService, RemoteApiEventsService>(); break; default: throw new ApplicationException($"Incorrect {nameof(EventsServiceType)}"); } services.AddScoped <IEventSalaryService, EventSalaryService>(); services.AddScoped <IReportSalaryService, GetAllReportSalaryService>(); services.AddAutoMapper(typeof(Requests)); JwtSecurityTokenHandler.DefaultMapInboundClaims = false; JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { var jwtOptions = Configuration.GetSection(nameof(JwtOptions)).Get <JwtOptions>(); options.Audience = jwtOptions.Audience; options.TokenValidationParameters.ValidateAudience = true; if (IsTests) { options.RequireHttpsMetadata = false; options.TokenValidationParameters.IssuerSigningKey = JwtTestsHelper.IssuerSigningKey(jwtOptions.DebugKey); options.TokenValidationParameters.ValidateLifetime = false; options.TokenValidationParameters.ValidateIssuer = false; } else { options.Authority = jwtOptions.Authority; options.RequireHttpsMetadata = false; options.TokenValidationParameters.ValidateLifetime = true; } }); services.AddAuthorization(options => { var defaultPolicy = new AuthorizationPolicyBuilder() .RequireClaim("scope", "itlab.salary") .RequireClaim("itlab", "user") .RequireClaim("sub") .Build(); options.DefaultPolicy = defaultPolicy; options.AddSalaryAdminPolicy(); options.AddReportsAdminPolicy(); }); services.AddApiVersioning( options => { // reporting api versions will return the headers "api-supported-versions" and "api-deprecated-versions" options.ReportApiVersions = true; }); services.AddVersionedApiExplorer( options => { // add the versioned api explorer, which also adds IApiVersionDescriptionProvider service // note: the specified format code will format the version as "'v'major[.minor][-status]" options.GroupNameFormat = "'v'VVV"; // note: this option is only necessary when versioning by url segment. the SubstitutionFormat // can also be used to control the format of the API version in route templates options.SubstituteApiVersionInUrl = true; }); services.AddTransient <IConfigureOptions <SwaggerGenOptions>, ConfigureSwaggerOptions>(); services.AddSwaggerGen( options => { var securityScheme = new OpenApiSecurityScheme { Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey }; options.AddSecurityDefinition("Bearer", securityScheme); var securityRequirement = new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, Array.Empty <string>() } }; options.AddSecurityRequirement(securityRequirement); // add a custom operation filter which sets default values options.OperationFilter <SwaggerDefaultValues>(); // integrate xml comments options.IncludeXmlComments(XmlCommentsFilePath); }); services.AddWebAppConfigure() .AddTransientConfigure <MigrateMongoDbWork>(0) .AddTransientConfigure <ShowTestAdminTokenWork>(IsTests, 1); services.AddCors(options => { options.AddPolicy(AllowAllOrigins, builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); }
/// <summary> /// Show token /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public Task Configure(CancellationToken cancellationToken) { logger.LogInformation(JwtTestsHelper.DebugAdminToken(jwtOptions.Value)); return(Task.CompletedTask); }