// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddDbContext <BookDBContext>(options => options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"])); services.AddTransient <IDocumentResultService, DocumentResultDataAccessLayer>(); services.AddTransient <IUserService, UserDataAccessLayer>(); services.AddTransient <ICategoryService, CategoriesDataAccessLayer>(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "BookCart API", Version = "v1", Contact = new OpenApiContact { Name = "Ankit Sharma", Url = new Uri("https://ankitsharmablogs.com/"), }, License = new OpenApiLicense { Name = "MIT Licenese", Url = new Uri("https://github.com/AnkitSharma-007/BookCart/blob/master/LICENSE"), } }); c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme { Description = "Standard JWT Authorization header. Example: \"bearer {token}\"", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey }); c.OperationFilter <SecurityRequirementsOperationFilter>(); // Set the comments path for the Swagger JSON and UI. var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath); }); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.RequireHttpsMetadata = false; options.SaveToken = true; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"])), ClockSkew = TimeSpan.Zero // Override the default clock skew of 5 mins }; services.AddCors(); }); services.AddAuthorization(config => { config.AddPolicy(UserRoles.Admin, Policies.AdminPolicy()); config.AddPolicy("Manager", Policies.ManagerPolicy()); config.AddPolicy(UserRoles.Contributor, Policies.ContributorPolicy()); config.AddPolicy(UserRoles.User, Policies.UserPolicy()); }); services.AddControllersWithViews(); // In production, the Angular files will be served from this directory services.AddSpaStaticFiles(configuration => { configuration.RootPath = "ClientApp/dist"; }); }