using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MediatR;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
using MyHN.Application;
using MyHN.Domain;
using MyHN.Infrastructure;
using MyHN.Infrastructure.Repositories;
using NSwag.Generation.Processors.Security;
namespace Api
{
///
/// Représente les options nécessaires à la génération / validation
/// d'un jeton JWT.
///
public class TokenOptions
{
public string Issuer { get; set; }
public string Audience { get; set; }
public string SecurityKey { get; set; }
public SecurityKey Key => new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecurityKey));
}
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddMyHNServices(Configuration)
.AddUserProvider();
var tokenOptions = Configuration.GetSection("Token").Get();
services.AddSingleton(tokenOptions);
services.AddIdentityCore(options =>
{
options.Password.RequiredLength = options.Password.RequiredUniqueChars = 0;
options.Password.RequireDigit = options.Password.RequireLowercase = options.Password.RequireNonAlphanumeric = options.Password.RequireUppercase = false;
})
.AddRoles()
.AddEntityFrameworkStores()
.AddSignInManager();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = tokenOptions.Issuer,
ValidAudience = tokenOptions.Audience,
IssuerSigningKey = tokenOptions.Key
};
});
services.AddControllers(options =>
{
options.Filters.Add(new CustomExceptionFilter());
});
services.AddOpenApiDocument(doc =>
{
doc.AddSecurity("JWT", Enumerable.Empty(), new NSwag.OpenApiSecurityScheme()
{
Type = NSwag.OpenApiSecuritySchemeType.ApiKey,
Name = "Authorization",
In = NSwag.OpenApiSecurityApiKeyLocation.Header,
Description = "Renseigner votre jeton: Bearer {votre jeton}"
});
// doc.OperationProcessors.Add(new AspNetCoreOperationSecurityScopeProcessor("JWT"));
doc.PostProcess = od =>
{
od.Info.Title = "MyHN API Documentation";
};
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
MigrateDatabase(app.ApplicationServices);
app.UseOpenApi();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwaggerUi3();
}
app.UseCors(o =>
{
o.AllowAnyOrigin();
o.AllowAnyMethod();
// o.AllowAnyHeader();
o.WithHeaders("content-type", "authorization");
});
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});
}
private void MigrateDatabase(IServiceProvider provider)
{
using var scope = provider.CreateScope();
using var ctx = scope.ServiceProvider.GetRequiredService();
ctx.Database.Migrate();
}
}
}