Skip to content

Commit

Permalink
add authentication
Browse files Browse the repository at this point in the history
  • Loading branch information
Barsonax committed May 21, 2024
1 parent 99f13be commit a6d6c26
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 5 deletions.
41 changes: 41 additions & 0 deletions CleanAspCore.Api.Tests/TestSetup/TestJwtGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;

namespace CleanAspCore.Api.Tests.TestSetup;

public static class TestJwtGenerator
{
private const string Audience = "TestUsers";
private static readonly string _issuer = Guid.NewGuid().ToString();
private static readonly SecurityKey _securityKey = new SymmetricSecurityKey("A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6"u8.ToArray()) { KeyId = Guid.NewGuid().ToString() };
private static readonly SigningCredentials _signingCredentials = new SigningCredentials(_securityKey, SecurityAlgorithms.HmacSha256);

private static readonly JwtSecurityTokenHandler _sTokenHandler = new();

public static string GenerateJwtToken(IEnumerable<Claim> claims)
{
return _sTokenHandler.WriteToken(new JwtSecurityToken(_issuer, Audience, claims, null, DateTime.UtcNow.AddMinutes(20), _signingCredentials));
}

public static IServiceCollection ConfigureTestJwt(this IServiceCollection services)
{
services.RemoveAll(typeof(IConfigureOptions<JwtBearerOptions>)); // Remove any already configured jwt bearer options configurators as we want to be in control of this in the tests.
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.Configuration = new OpenIdConnectConfiguration
{
Issuer = _issuer,
SigningKeys = { _securityKey }
};
options.Audience = Audience;
});

return services;
}
}
17 changes: 13 additions & 4 deletions CleanAspCore.Api.Tests/TestSetup/TestWebApi.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using CleanAspCore.Data;
using System.Net.Http.Headers;
using System.Security.Claims;
using CleanAspCore.Data;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
Expand Down Expand Up @@ -39,6 +41,7 @@ protected override IHost CreateHost(IHostBuilder builder)
services.AddDbContext<HrContext>(c => c
.EnableSensitiveDataLogging()
.EnableDetailedErrors());
services.ConfigureTestJwt();
});

builder.ConfigureLogging(loggingBuilder =>
Expand Down Expand Up @@ -75,8 +78,14 @@ public void AssertDatabase(Action<HrContext> seedAction)
seedAction(context);
}

public T CreateClientFor<T>() => RestService.For<T>(CreateClient(new WebApplicationFactoryClientOptions()
public T CreateClientFor<T>(params Claim[] claims)
{
BaseAddress = new Uri("https://localhost") // Prevents https redirection warnings.
}));
var jwt = TestJwtGenerator.GenerateJwtToken(claims);
var client = CreateClient(new WebApplicationFactoryClientOptions
{
BaseAddress = new Uri("https://localhost") // Prevents https redirection warnings.
});
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwt);
return RestService.For<T>(client);
}
}
7 changes: 6 additions & 1 deletion CleanAspCore/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using CleanAspCore.Data;
using MicroElements.Swashbuckle.FluentValidation.AspNetCore;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;

var builder = WebApplication.CreateBuilder(args);

Expand All @@ -16,7 +17,11 @@
});
builder.Services.AddFluentValidationRulesToSwagger();

builder.Services.AddAuthorization();
builder.Services.AddAuthorizationBuilder()
.AddFallbackPolicy("Fallback", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build());

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme);

Expand Down

0 comments on commit a6d6c26

Please sign in to comment.