From b87ee39a5e16a5d20f9fe3651c7069a5f3cc3884 Mon Sep 17 00:00:00 2001 From: bekodeg Date: Fri, 13 Jun 2025 20:15:08 +0400 Subject: [PATCH] + --- .../Configurations/SwaggerConfiguration.cs | 7 ++ .../Models/UserRequests/LoginRequest.cs | 3 +- .../ApplicationSystem.Database.csproj | 2 +- .../ApplicationSystem.Identity.csproj | 7 +- .../Extensions/DiExtensions.cs | 8 ++- ApplicationSystem/ApplicationSystem.csproj | 7 +- .../Controllers/ApplicationsController.cs | 2 + .../Controllers/UsersController.cs | 2 + .../Extensions/ApplicationExtensions.cs | 27 ++++++++ ApplicationSystem/Extensions/DiExtensions.cs | 67 +++++++++++++++++-- .../ApplicationCreateCommand.cs | 6 ++ ApplicationSystem/Program.cs | 11 ++- .../Properties/launchSettings.json | 19 +----- 13 files changed, 137 insertions(+), 31 deletions(-) create mode 100644 ApplicationSystem.Configurations/Configurations/SwaggerConfiguration.cs create mode 100644 ApplicationSystem/Extensions/ApplicationExtensions.cs create mode 100644 ApplicationSystem/Models/Queries/AplicationQueries/ApplicationCreateCommand.cs diff --git a/ApplicationSystem.Configurations/Configurations/SwaggerConfiguration.cs b/ApplicationSystem.Configurations/Configurations/SwaggerConfiguration.cs new file mode 100644 index 0000000..a5b2706 --- /dev/null +++ b/ApplicationSystem.Configurations/Configurations/SwaggerConfiguration.cs @@ -0,0 +1,7 @@ +namespace ApplicationSystem.Configurations.Configurations +{ + public class SwaggerConfiguration + { + public bool UseSwagger { get; init; } = true; + } +} diff --git a/ApplicationSystem.Contracts/Models/UserRequests/LoginRequest.cs b/ApplicationSystem.Contracts/Models/UserRequests/LoginRequest.cs index 789a4ca..14d4a1a 100644 --- a/ApplicationSystem.Contracts/Models/UserRequests/LoginRequest.cs +++ b/ApplicationSystem.Contracts/Models/UserRequests/LoginRequest.cs @@ -1,5 +1,4 @@ -using ApplicationSystem.MediatRHelper.Models; -using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations; namespace ApplicationSystem.Contracts.Models.UserRequests { diff --git a/ApplicationSystem.Database.Applications/ApplicationSystem.Database.csproj b/ApplicationSystem.Database.Applications/ApplicationSystem.Database.csproj index 0737e10..e2833a8 100644 --- a/ApplicationSystem.Database.Applications/ApplicationSystem.Database.csproj +++ b/ApplicationSystem.Database.Applications/ApplicationSystem.Database.csproj @@ -7,7 +7,7 @@ - + diff --git a/ApplicationSystem.Identity/ApplicationSystem.Identity.csproj b/ApplicationSystem.Identity/ApplicationSystem.Identity.csproj index c14053e..cdea55a 100644 --- a/ApplicationSystem.Identity/ApplicationSystem.Identity.csproj +++ b/ApplicationSystem.Identity/ApplicationSystem.Identity.csproj @@ -6,12 +6,13 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/ApplicationSystem.Identity/Extensions/DiExtensions.cs b/ApplicationSystem.Identity/Extensions/DiExtensions.cs index d85c78f..67b2ce9 100644 --- a/ApplicationSystem.Identity/Extensions/DiExtensions.cs +++ b/ApplicationSystem.Identity/Extensions/DiExtensions.cs @@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using ApplicationSystem.Configurations.Configurations; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; namespace ApplicationSystem.Identity.Extensions { @@ -16,9 +17,12 @@ namespace ApplicationSystem.Identity.Extensions /// /// /// - public static IServiceCollection AddApplicationSystemIdentityDatabase(this IServiceCollection services) + public static IServiceCollection AddApplicationSystemIdentityDatabase( + this IServiceCollection services, + IConfiguration configuration) { - services.AddOptions(); + services.Configure( + configuration.GetSection(nameof(ConnectionStringsConfiguration))); services.AddDbContext((sp, opt) => { diff --git a/ApplicationSystem/ApplicationSystem.csproj b/ApplicationSystem/ApplicationSystem.csproj index 35deb01..897971a 100644 --- a/ApplicationSystem/ApplicationSystem.csproj +++ b/ApplicationSystem/ApplicationSystem.csproj @@ -9,11 +9,14 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/ApplicationSystem/Controllers/ApplicationsController.cs b/ApplicationSystem/Controllers/ApplicationsController.cs index d9b9b8b..8f70b72 100644 --- a/ApplicationSystem/Controllers/ApplicationsController.cs +++ b/ApplicationSystem/Controllers/ApplicationsController.cs @@ -1,9 +1,11 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace ApplicationSystem.Controllers { [ApiController] + [Authorize] [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/[controller]")] public class ApplicationsController : ControllerBase diff --git a/ApplicationSystem/Controllers/UsersController.cs b/ApplicationSystem/Controllers/UsersController.cs index a6d8e33..4016cef 100644 --- a/ApplicationSystem/Controllers/UsersController.cs +++ b/ApplicationSystem/Controllers/UsersController.cs @@ -1,4 +1,5 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; namespace ApplicationSystem.Controllers @@ -9,6 +10,7 @@ namespace ApplicationSystem.Controllers public class UsersController : ControllerBase { [HttpPost("login")] + [ProducesResponseType(200)] public async Task LoginAsync() { await Task.Delay(100); diff --git a/ApplicationSystem/Extensions/ApplicationExtensions.cs b/ApplicationSystem/Extensions/ApplicationExtensions.cs new file mode 100644 index 0000000..aba7ae3 --- /dev/null +++ b/ApplicationSystem/Extensions/ApplicationExtensions.cs @@ -0,0 +1,27 @@ +using ApplicationSystem.Configurations.Configurations; +using ApplicationSystem.Identity.Database.Models; +using Microsoft.Extensions.Options; + +namespace ApplicationSystem.Extensions +{ + public static class ApplicationExtensions + { + public static void UseApplicationSwagger(this WebApplication applicationBuilder) + { + var options = applicationBuilder.Services + .GetRequiredService>() + .Value; + + if (options.UseSwagger) + { + applicationBuilder.UseSwagger(); + applicationBuilder.UseSwaggerUI(); + } + } + + public static void MapIdentityApi(this WebApplication applicationBuilder) + { + applicationBuilder.MapIdentityApi(); + } + } +} diff --git a/ApplicationSystem/Extensions/DiExtensions.cs b/ApplicationSystem/Extensions/DiExtensions.cs index a324ee5..3bf09aa 100644 --- a/ApplicationSystem/Extensions/DiExtensions.cs +++ b/ApplicationSystem/Extensions/DiExtensions.cs @@ -1,7 +1,10 @@ using ApplicationSystem.Identity.Database.Context; using ApplicationSystem.Identity.Database.Models; using ApplicationSystem.Identity.Extensions; +using Asp.Versioning; using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.OpenApi.Models; namespace ApplicationSystem.Extensions { @@ -10,20 +13,76 @@ namespace ApplicationSystem.Extensions /// public static class DiExtensions { + public static IServiceCollection AddSwagger(this IServiceCollection services) + { + _ = services.AddApiVersioning(setup => + { + setup.DefaultApiVersion = new ApiVersion(1, 0); + setup.AssumeDefaultVersionWhenUnspecified = true; + setup.ReportApiVersions = true; + }).AddApiExplorer(setup => + { + setup.GroupNameFormat = "'v'VVV"; + setup.SubstituteApiVersionInUrl = true; + setup.DefaultApiVersion = new ApiVersion(1, 0); + }); + + _ = services.AddSwaggerGen(opt => + { + opt.SwaggerDoc("v1", new OpenApiInfo { Title = "ApplicationSystem", Version = "1", }); + opt.EnableAnnotations(); + opt.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme() + { + Name = "Authorization", + Type = SecuritySchemeType.ApiKey, + Scheme = "Bearer", + BearerFormat = "JWT", + In = ParameterLocation.Header, + Description = "JWT Authorization header using the Bearer scheme." + }); + + opt.AddSecurityRequirement(new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Type = ReferenceType.SecurityScheme, + Id = "Bearer" + }, + Scheme = IdentityConstants.BearerScheme, + Name = "Bearer", + In = ParameterLocation.Header + }, + Array.Empty() + } + }); + }); + + return services; + } + /// /// Добавить ролевую систему /// /// /// - public static IServiceCollection AddApplicationSystemIdentity(this IServiceCollection services) + public static IServiceCollection AddApplicationSystemIdentity( + this IServiceCollection services, + IConfiguration configuration) { - services.AddAuthentication(); services.AddAuthorization(); + services.AddAuthentication() + .AddCookie(IdentityConstants.ApplicationScheme) + .AddBearerToken(IdentityConstants.BearerScheme); - services.AddApplicationSystemIdentityDatabase(); + services.AddApplicationSystemIdentityDatabase(configuration); - services.AddIdentity() + services.AddIdentityCore() + .AddRoles() .AddEntityFrameworkStores() + .AddApiEndpoints() .AddDefaultTokenProviders(); return services; diff --git a/ApplicationSystem/Models/Queries/AplicationQueries/ApplicationCreateCommand.cs b/ApplicationSystem/Models/Queries/AplicationQueries/ApplicationCreateCommand.cs new file mode 100644 index 0000000..376eaed --- /dev/null +++ b/ApplicationSystem/Models/Queries/AplicationQueries/ApplicationCreateCommand.cs @@ -0,0 +1,6 @@ +namespace ApplicationSystem.Models.Queries.AplicationQueries +{ + public class ApplicationCreateCommand + { + } +} diff --git a/ApplicationSystem/Program.cs b/ApplicationSystem/Program.cs index 79cee25..4ad5dfa 100644 --- a/ApplicationSystem/Program.cs +++ b/ApplicationSystem/Program.cs @@ -1,9 +1,18 @@ using ApplicationSystem.Extensions; +using ApplicationSystem.Identity.Database.Models; var builder = WebApplication.CreateBuilder(args); -builder.Services.AddApplicationSystemIdentity(); +builder.Services.AddControllers().AddNewtonsoftJson(); +builder.Services.AddEndpointsApiExplorer(); + +builder.Services.AddSwagger(); + +builder.Services.AddApplicationSystemIdentity(builder.Configuration); var app = builder.Build(); +app.MapIdentityApi(); +app.UseApplicationSwagger(); + app.Run(); diff --git a/ApplicationSystem/Properties/launchSettings.json b/ApplicationSystem/Properties/launchSettings.json index 1d2cc07..f839762 100644 --- a/ApplicationSystem/Properties/launchSettings.json +++ b/ApplicationSystem/Properties/launchSettings.json @@ -1,18 +1,11 @@ { "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:4737", - "sslPort": 44306 - } - }, "profiles": { "http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, + "launchUrl": "swagger", "applicationUrl": "http://localhost:5053", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" @@ -22,14 +15,8 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, - "applicationUrl": "https://localhost:7164;http://localhost:5053", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://0.0.0.0:7164;http://0.0.0.0:5053", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }