-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
137 lines (114 loc) · 4.53 KB
/
Program.cs
File metadata and controls
137 lines (114 loc) · 4.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
using System.IO.Compression;
using Blog;
using Blog.Data;
using Blog.Services;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
ConfigureAuthentication(builder);
ConfigureMvc(builder);
ConfigureServices(builder);
//Carregando as dependencias do Swager
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
LoadConfiguration(app);
void LoadConfiguration(WebApplication app)
{
//definindo as configurações do appsettings
Configuration.JwtKey = app.Configuration.GetValue<string>("JwtKey");
Configuration.ApiKeyName = app.Configuration.GetValue<string>("ApiKeyName");
Configuration.ApiKey = app.Configuration.GetValue<string>("ApiKey");
//carregando o nó de SMTP
var smtp = new Configuration.SmtpConfiguration();
app.Configuration.GetSection("Smtp").Bind(smtp);
Configuration.Smtp = smtp;
//definindo o encaminhamento automático para https
app.UseHttpsRedirection();
//definindo que usa autorização e autenticação
app.UseAuthentication(); //quem é o usuário
app.UseAuthorization(); //o que ele pode fazer
//mapeando os controles
app.MapControllers();
//definindo que a resposta deve ser zipada
app.UseResponseCompression();
//falando que o servidor pode renderizar html, css, imagens
app.UseStaticFiles();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.Run();
}
void ConfigureAuthentication(WebApplicationBuilder builder)
{
//configuranado o token
var key = Encoding.ASCII.GetBytes(Configuration.JwtKey);
//adicionando o esquema de autenticação
builder.Services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x => //mostrando com descriptografar o token
{
//passando os parametro para validação do token e descriptografar
x.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
}
void ConfigureMvc(WebApplicationBuilder builder)
{
builder.Services.AddMemoryCache(); //adiciona suporte para cache
builder.Services.AddResponseCompression(options =>
{
//options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>(); //define a forma de compressão
//options.Providers.Add<CustomCompressionProvider>();
});
//configurando a compressão
builder.Services.Configure<GzipCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Optimal;
});
builder.Services
.AddControllers()
//suprime a validação automática dos controllers
.ConfigureApiBehaviorOptions(options =>
{
options.SuppressModelStateInvalidFilter = true;
})
//mudando a forma padrão de serializar e desserializar para json
.AddJsonOptions(x =>
{
x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; //ignorando referencia circular
x.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault; //quando tiver objeto null não renderiza
});
}
void ConfigureServices(WebApplicationBuilder builder)
{
//pegando a minha connection string no app settings
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
//configurando a conexão com o banco de dados e passando a string de conexão
builder.Services.AddDbContext<BlogDataContext>(options =>
options.UseSqlServer(connectionString));
////sempre criar um nova instancia
//builder.Services.AddTransient();
////Dura por requisição (sempre ao iniciar um request)
//builder.Services.AddScoped();
////um por app, sempre vai estar na memória da aplicação, uma vez chamado vai ser sempre a mesma instancia
//builder.Services.AddSingleton();
//token da aplicação
builder.Services.AddTransient<TokenService>();
//Serviço de email da aplicação
builder.Services.AddTransient<EmailService>();
}