Beispiel #1
0
        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);
            });
        }
Beispiel #2
0
        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);
 }