using Api; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.IdentityModel.Protocols.OpenIdConnect; using Microsoft.AspNetCore.TestHost; namespace Tests { public static class MockJwtTokens { public static string Issuer { get; } = Guid.NewGuid().ToString(); public static SecurityKey SecurityKey { get; } public static SigningCredentials SigningCredentials { get; } private static readonly JwtSecurityTokenHandler s_tokenHandler = new JwtSecurityTokenHandler(); private static readonly RandomNumberGenerator s_rng = RandomNumberGenerator.Create(); private static readonly byte[] s_key = new byte[32]; static MockJwtTokens() { s_rng.GetBytes(s_key); SecurityKey = new SymmetricSecurityKey(s_key) { KeyId = Guid.NewGuid().ToString() }; SigningCredentials = new SigningCredentials(SecurityKey, SecurityAlgorithms.HmacSha256); } public static string GenerateJwtToken(IEnumerable claims) { return s_tokenHandler.WriteToken(new JwtSecurityToken(Issuer, null, claims, null, DateTime.UtcNow.AddMinutes(20), SigningCredentials)); } } public class BaseIntegrationTest : WebApplicationFactory { protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.ConfigureTestServices(ConfigureServices); builder.ConfigureLogging((WebHostBuilderContext context, ILoggingBuilder loggingBuilder) => { loggingBuilder.ClearProviders(); loggingBuilder.AddConsole(options => options.IncludeScopes = true); }); } protected virtual void ConfigureServices(IServiceCollection services) { services.Configure(JwtBearerDefaults.AuthenticationScheme, options => { var config = new OpenIdConnectConfiguration() { Issuer = MockJwtTokens.Issuer }; config.SigningKeys.Add(MockJwtTokens.SecurityKey); options.Configuration = config; }); } } }