using AsbCloudApp.Data.GTR; using AsbCloudApp.Repositories; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Threading.Tasks; using AsbCloudApp.Services.Notifications; using AsbCloudWebApi.SignalR.Services; using Microsoft.OpenApi.Any; namespace AsbCloudWebApi { public static class DependencyInjection { public static void AddSwagger(this IServiceCollection services) { services.AddSwaggerGen(c => { c.MapType(() => new OpenApiSchema { Type = "string", Example = new OpenApiString("1.00:00:00") }); c.MapType(() => new OpenApiSchema { Type = "string", Format = "date" }); c.MapType(() => new OpenApiSchema { AnyOf = new OpenApiSchema[] { new OpenApiSchema {Type = "string", Format = "string" }, new OpenApiSchema {Type = "number", Format = "int32" }, new OpenApiSchema {Type = "number", Format = "float" }, } }); c.CustomOperationIds(e => { return $"{e.ActionDescriptor.RouteValues["action"]}"; }); c.SwaggerDoc("v1", new OpenApiInfo { Title = "ASB cloud web api", Version = "v1" }); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Description = @"JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token in the text input below. Example: 'Bearer 12345abcdef'", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, Scheme = "Bearer", }); c.AddSecurityRequirement(new OpenApiSecurityRequirement() { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }, Scheme = "oauth2", Name = "Bearer", In = ParameterLocation.Header, }, new List() } }); var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); var includeControllerXmlComment = true; c.IncludeXmlComments(xmlPath, includeControllerXmlComment); c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "AsbCloudApp.xml"), includeControllerXmlComment); }); } public static void AddJWTAuthentication(this IServiceCollection services) { services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.RequireHttpsMetadata = false; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = AuthService.issuer, ValidateAudience = true, ValidAudience = AuthService.audience, ValidateLifetime = true, IssuerSigningKey = AuthService.securityKey, ValidateIssuerSigningKey = true, }; options.Events = new JwtBearerEvents { OnMessageReceived = context => { var accessToken = context.Request.Query["access_token"]; var path = context.HttpContext.Request.Path; if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/hubs")) { context.Token = accessToken; } return Task.CompletedTask; }, OnTokenValidated = context => { var idUser = context.Principal?.GetUserId(); if (idUser is null) { context.Fail("idUser is null"); return Task.CompletedTask; } context.HttpContext.RequestServices.GetRequiredService(); var userService = services.BuildServiceProvider().GetRequiredService(); var user = userService.GetOrDefault(idUser.Value); if (user is null) { context.Fail("user is null"); } else if (user.IdState != User.ActiveStateId) { context.Fail("user is not active"); } return Task.CompletedTask; } }; }); } public static void AddNotificationTransportServices(this IServiceCollection services) { services.AddTransient(); } } }