-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
121 lines (102 loc) · 4.08 KB
/
Program.cs
File metadata and controls
121 lines (102 loc) · 4.08 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
using FluentValidation;
using SharpGrip.FluentValidation.AutoValidation.Mvc.Extensions;
using MusicWebApi.src.Application.Services;
using MusicWebApi.src.Api.Dto;
using MusicWebApi.src.Api.Validators;
using MusicWebApi.src.Infrastructure.Database;
using MusicWebApi.src.Infrastructure.Redis;
using MusicWebApi.src.Domain.Options;
using MusicWebApi.src.Infrastructure.Redisk;
using MusicWebApi.src.Infrastructure.MailService;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
builder.Logging.ClearProviders();
builder.Logging.AddConsole();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddScoped<IValidator<UserAuth>, UserValidator>();
builder.Services.AddFluentValidationAutoValidation();
// Add services to the container.
builder.Services.Configure<DatabaseSettings>(
builder.Configuration.GetSection("Database"));
// Register JwtSettings configuration
builder.Services.Configure<JwtSettings>(
builder.Configuration.GetSection("Jwt"));
builder.Services.Configure<UserRedisRepoSettings>(
builder.Configuration.GetSection("UserRedisRepoSettings"));
builder.Services.Configure<TokenRepoSettings>(
builder.Configuration.GetSection("TokenRepoSettings"));
builder.Services.Configure<VerifyRepoSettings>(
builder.Configuration.GetSection("VarifyRepoSettings"));
builder.Services.Configure<MailServiceSettings>(
builder.Configuration.GetSection("MailServiceSettings"));
var jwtSettings = builder.Configuration.GetSection("Jwt").Get<JwtSettings>()
?? throw new InvalidOperationException("JwtSettings not configured.");
var key = Encoding.ASCII.GetBytes(jwtSettings.Secret);
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = builder.Environment.IsProduction(); // True in production
options.SaveToken = true; // Not strictly necessary if we read from cookie ourselves, but good practice
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = true,
ValidIssuer = jwtSettings.Issuer,
ValidateAudience = true,
ValidAudience = jwtSettings.Audience,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero // Remove clock skew
};
// Read token from HttpOnly cookie
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
context.Token = context.Request.Cookies[jwtSettings.AccessTokenStorage];
return Task.CompletedTask;
},
// Optional: Handle authentication failure (e.g., token expired but not yet refreshed)
OnAuthenticationFailed = context =>
{
if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
{
context.Response.Headers.Append("Token-Expired", "true");
}
return Task.CompletedTask;
}
};
});
//redis
builder.Services.AddSingleton<UserRedisRepository>();
builder.Services.AddSingleton<TokenRepository>();
builder.Services.AddSingleton<VerifyMailRepo>();
//mongo
builder.Services.AddSingleton<UsersRepository>();
builder.Services.AddSingleton<MusicFileRepository>();
builder.Services.AddSingleton<MusicRepository>();
//services
builder.Services.AddSingleton<JwtService>();
builder.Services.AddSingleton<EmailService>();
builder.Services.AddSingleton<AuthService>();
builder.Services.AddSingleton<PlatformsService>();
// Filters
builder.Services.AddScoped<UsersExceptionFilter>();
builder.Services.AddControllers();
var app = builder.Build();
//if (app.Environment.IsDevelopment())
//{
app.UseSwagger();
app.UseSwaggerUI();
//}
app.UseAuthentication(); // <<<<<<<< HERE
app.UseAuthorization(); // <<<<<<<< And HERE
app.MapControllers();
app.Run();