using Core.Interfaces; using Core.Services; using Google.Authenticator; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using Models.Interfaces; using Models.Models; using Models.Repositories; using phronCare.API.Models; using Services.Models; using Services.Services; using Services.Interfaces; using System.Text; var builder = WebApplication.CreateBuilder(args); #region DbContext Identity Configuration var configuration = builder.Configuration; builder.Services.AddDbContext(options => options.UseSqlServer(configuration.GetConnectionString("phronCareDB"))); builder.Services.AddDbContext(options => options.UseSqlServer(configuration.GetConnectionString("PhronCareOperationsHubConnection"))); builder.Services.AddScoped(); builder.Services.AddScoped(); #endregion #region Require Confirmed Email builder.Services.Configure( opts => opts.SignIn.RequireConfirmedEmail = true ); #endregion #region Identity EF Configuration builder.Services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders(); #endregion builder.Services.Configure( opts => opts.TokenLifespan=TimeSpan.FromHours(10)); builder.Services.AddSingleton(); #region Authentication Service builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(options => { options.Audience = configuration["JWT:ValidAudience"]; options.RequireHttpsMetadata = false; options.SaveToken = true; options.IncludeErrorDetails = true; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateIssuerSigningKey = true, ValidIssuer = configuration["JWT:ValidIssuer"], ValidAudience = configuration["JWT:ValidAudience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(configuration["JWT:Secret"])), }; }); #endregion #region Email Configuration var emailConfig = configuration.GetSection("EmailConfiguration").Get(); builder.Services.AddSingleton(emailConfig); builder.Services.AddScoped(); #endregion #region Swagger Authorization builder.Services.AddSwaggerGen(option => { option.SwaggerDoc("v1", new OpenApiInfo { Title = "phronCARE API - SaludLAB", Version = "v1" }); option.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "Por favor, ingrese un token valido", Name = "Authorization", Type = SecuritySchemeType.Http, BearerFormat = "JWT", Scheme = "Bearer" }); option.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type=ReferenceType.SecurityScheme, Id="Bearer" } }, new string[]{} } }); }); #endregion #region CORS builder.Services.AddCors(p => p.AddPolicy("CORS", builder => { builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); })); #endregion builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); var app = builder.Build(); //if (app.Environment.IsDevelopment()) //{ app.UseSwagger(); app.UseSwaggerUI(); //} app.UseCors("CORS"); app.UseHttpsRedirection(); app.MapControllers(); app.UseAuthentication(); app.UseAuthorization(); app.Run();