Skip to content

Commit 9ae15f8

Browse files
Merge pull request #22 from NetDevPack/fix/namespaces
Fix/namespaces
2 parents 831a1d0 + c230c22 commit 9ae15f8

File tree

8 files changed

+70
-62
lines changed

8 files changed

+70
-62
lines changed

samples/NetDevPack.Security.Jwt.AspNet.SymetricKey/Program.cs

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
using System.Security.Claims;
22
using Microsoft.AspNetCore.Authentication.JwtBearer;
33
using Microsoft.AspNetCore.Authorization;
4+
using Microsoft.AspNetCore.DataProtection;
5+
using Microsoft.AspNetCore.Mvc;
46
using Microsoft.IdentityModel.JsonWebTokens;
57
using Microsoft.IdentityModel.Logging;
68
using Microsoft.IdentityModel.Tokens;
79
using Microsoft.OpenApi.Models;
810
using NetDevPack.Security.Jwt.AspNet.SymetricKey;
911
using NetDevPack.Security.Jwt.AspNetCore;
10-
using NetDevPack.Security.Jwt.Core;
1112
using NetDevPack.Security.Jwt.Core.Interfaces;
12-
using NetDevPack.Security.Jwt.Core.Jwa;
1313

1414

1515
var builder = WebApplication.CreateBuilder(args);
@@ -21,7 +21,7 @@
2121
{
2222
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
2323
{
24-
Description = "Insira o token JWT desta maneira: Bearer {seu token}",
24+
Description = "Bearer {token}",
2525
Name = "Authorization",
2626
Scheme = "Bearer",
2727
BearerFormat = "JWT",
@@ -54,12 +54,14 @@
5454
ValidateLifetime = true,
5555
ValidateIssuerSigningKey = true,
5656
ValidIssuer = "NetDevPack",
57-
ValidAudience = "NetDevPack.AspNet.SymetricKey"
57+
ValidAudience = "NetDevPack.Security.Jwt.AspNet"
5858
};
5959
});
60+
builder.Services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(Directory.GetCurrentDirectory()));
6061
builder.Services.AddAuthorization();
61-
builder.Services.AddJwksManager().UseJwtValidation().PersistKeysInMemory();
62+
builder.Services.AddJwksManager().UseJwtValidation();
6263
builder.Services.AddMemoryCache();
64+
builder.Services.AddHttpContextAccessor();
6365

6466
var app = builder.Build();
6567
IdentityModelEventSource.ShowPII = true;
@@ -74,7 +76,7 @@
7476
app.UseAuthorization();
7577
app.UseHttpsRedirection();
7678

77-
app.MapGet("/random-jws", [AllowAnonymous]async (IJwtService service) =>
79+
app.MapGet("/random-jws", async (IJwtService service) =>
7880
{
7981
var handler = new JsonWebTokenHandler();
8082
var now = DateTime.Now;
@@ -94,27 +96,27 @@
9496
.WithName("Generate random JWS")
9597
.WithTags("JWS");
9698

97-
app.MapGet("/random-jwe", [AllowAnonymous] async (IJwtService service) =>
98-
{
99-
var handler = new JsonWebTokenHandler();
100-
var now = DateTime.Now;
101-
var descriptor = new SecurityTokenDescriptor
102-
{
103-
Issuer = "NetDevPack",
104-
Audience = "NetDevPack.Security.Jwt.AspNet",
105-
IssuedAt = now,
106-
NotBefore = now,
107-
Expires = now.AddMinutes(5),
108-
Subject = new ClaimsIdentity(FakeClaims.GenerateClaim().Generate(5)),
109-
EncryptingCredentials = await service.GetCurrentEncryptingCredentials()
110-
};
111-
112-
return handler.CreateToken(descriptor);
113-
})
99+
app.MapGet("/random-jwe", async (IJwtService service) =>
100+
{
101+
var handler = new JsonWebTokenHandler();
102+
var now = DateTime.Now;
103+
var descriptor = new SecurityTokenDescriptor
104+
{
105+
Issuer = "NetDevPack",
106+
Audience = "NetDevPack.Security.Jwt.AspNet",
107+
IssuedAt = now,
108+
NotBefore = now,
109+
Expires = now.AddMinutes(5),
110+
Subject = new ClaimsIdentity(FakeClaims.GenerateClaim().Generate(5)),
111+
EncryptingCredentials = await service.GetCurrentEncryptingCredentials()
112+
};
113+
114+
return handler.CreateToken(descriptor);
115+
})
114116
.WithName("Generate random JWE")
115117
.WithTags("JWE");
116118

117-
app.MapGet("/validate-jwt/{jwt}", [Authorize]async (IJwtService service, string jwt) =>
119+
app.MapGet("/validate-jwt/{jwt}", async (IJwtService service, string jwt) =>
118120
{
119121
var handler = new JsonWebTokenHandler();
120122

@@ -151,5 +153,10 @@
151153
.WithName("Validate JWE")
152154
.WithTags("Validate");
153155

156+
app.MapGet("/protected-endpoint", [Authorize] ([FromServices] IHttpContextAccessor context) =>
157+
{
158+
return Results.Ok(context.HttpContext?.User.Claims.Select(s => new { s.Type, s.Value }));
159+
}).WithName("Protected Endpoint")
160+
.WithTags("Validate");
154161

155162
app.Run();

src/NetDevPack.Security.Jwt.AspNetCore/AspNetBuilderExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
using Microsoft.AspNetCore.Authentication.JwtBearer;
22
using Microsoft.AspNetCore.Builder;
33
using Microsoft.AspNetCore.Http;
4-
using Microsoft.Extensions.DependencyInjection;
54
using Microsoft.Extensions.Options;
5+
using NetDevPack.Security.Jwt.AspNetCore;
66
using NetDevPack.Security.Jwt.Core.Interfaces;
77

8-
namespace NetDevPack.Security.Jwt.AspNetCore;
8+
namespace Microsoft.Extensions.DependencyInjection;
99

1010
public static class AspNetBuilderExtensions
1111
{

src/NetDevPack.Security.Jwt.AspNetCore/NetDevPack.Security.Jwt.AspNetCore.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<TargetFrameworks>netcoreapp3.1;net5.0;net6.0</TargetFrameworks>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
7-
<Authors>Eduardo Pires</Authors>
7+
<Authors>Bruno Brito, Eduardo Pires</Authors>
88
<LangVersion>10.0</LangVersion>
99
<PackageIconUrl>https://raw.githubusercontent.com/NetDevPack/NetDevPack/master/assets/IconNuget.png</PackageIconUrl>
1010
<PackageTags>jwt jwks rsa ecdsa hmac oauth2 key rotating</PackageTags>
Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,36 @@
1-
using Microsoft.Extensions.DependencyInjection;
1+
using NetDevPack.Security.Jwt.Core;
22
using NetDevPack.Security.Jwt.Core.DefaultStore;
33
using NetDevPack.Security.Jwt.Core.Interfaces;
44
using NetDevPack.Security.Jwt.Core.Jwt;
55

6-
namespace NetDevPack.Security.Jwt.Core
6+
namespace Microsoft.Extensions.DependencyInjection;
7+
8+
public static class JsonWebKeySetManagerDependencyInjection
79
{
8-
public static class JsonWebKeySetManagerDependencyInjection
10+
/// <summary>
11+
/// Sets the signing credential.
12+
/// </summary>
13+
/// <returns></returns>
14+
public static IJwksBuilder AddJwksManager(this IServiceCollection services, Action<JwtOptions> action = null)
915
{
10-
/// <summary>
11-
/// Sets the signing credential.
12-
/// </summary>
13-
/// <returns></returns>
14-
public static IJwksBuilder AddJwksManager(this IServiceCollection services, Action<JwtOptions> action = null)
15-
{
16-
if (action != null)
17-
services.Configure(action);
16+
if (action != null)
17+
services.Configure(action);
1818

19-
services.AddDataProtection();
20-
services.AddScoped<IJwtService, JwtService>();
21-
services.AddScoped<IJsonWebKeyStore, DataProtectionStore>();
19+
services.AddDataProtection();
20+
services.AddScoped<IJwtService, JwtService>();
21+
services.AddScoped<IJsonWebKeyStore, DataProtectionStore>();
2222

23-
return new JwksBuilder(services);
24-
}
23+
return new JwksBuilder(services);
24+
}
2525

26-
/// <summary>
27-
/// Sets the signing credential.
28-
/// </summary>
29-
/// <returns></returns>
30-
public static IJwksBuilder PersistKeysInMemory(this IJwksBuilder builder)
31-
{
32-
builder.Services.AddScoped<IJsonWebKeyStore, InMemoryStore>();
26+
/// <summary>
27+
/// Sets the signing credential.
28+
/// </summary>
29+
/// <returns></returns>
30+
public static IJwksBuilder PersistKeysInMemory(this IJwksBuilder builder)
31+
{
32+
builder.Services.AddScoped<IJsonWebKeyStore, InMemoryStore>();
3333

34-
return builder;
35-
}
34+
return builder;
3635
}
37-
}
36+
}
Binary file not shown.
Binary file not shown.

src/NetDevPack.Security.Jwt.Store.FileSystem/FileSystemStoreExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
using Microsoft.Extensions.Options;
44
using NetDevPack.Security.Jwt.Core;
55
using NetDevPack.Security.Jwt.Core.Interfaces;
6+
using NetDevPack.Security.Jwt.Store.FileSystem;
67

7-
namespace NetDevPack.Security.Jwt.Store.FileSystem;
8+
namespace Microsoft.Extensions.DependencyInjection;
89

910
/// <summary>
1011
/// Builder extension methods for registering crypto services
@@ -17,7 +18,6 @@ public static class FileSystemStoreExtensions
1718
/// <returns></returns>
1819
public static IJwksBuilder PersistKeysToFileSystem(this IJwksBuilder builder, DirectoryInfo directory)
1920
{
20-
2121
builder.Services.AddScoped<IJsonWebKeyStore, FileSystemStore>(provider => new FileSystemStore(directory, provider.GetRequiredService<IOptions<JwtOptions>>(), provider.GetRequiredService<IMemoryCache>()));
2222

2323
return builder;

tests/NetDevPack.Security.Jwt.Tests/StoreTests/GenericStoreServiceTest.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Linq;
33
using System.Security.Claims;
4+
using System.Threading;
45
using System.Threading.Tasks;
56
using Bogus;
67
using FluentAssertions;
@@ -15,10 +16,11 @@
1516
using NetDevPack.Security.Jwt.Tests.Warmups;
1617
using Xunit;
1718

18-
namespace NetDevPack.Security.Jwt.Tests.StoreTests;
19+
namespace NetDevPack.Security.Jwt.Tests.StoreTests;
1920
public abstract class GenericStoreServiceTest<TWarmup> : IClassFixture<TWarmup>
2021
where TWarmup : class, IWarmupTest
2122
{
23+
private static SemaphoreSlim TestSync = new(1);
2224
private readonly IJsonWebKeyStore _store;
2325
private readonly IOptions<JwtOptions> _options;
2426
public TWarmup WarmupData { get; }
@@ -375,18 +377,18 @@ public async Task ShouldSaveDeterministicJwkRecoverAndSigning(string algorithm)
375377
public async Task ShouldSaveJweRecoverAndEncrypt(string algorithm, string encryption)
376378
{
377379
await WarmupData.Clear();
378-
379380
var handler = new JsonWebTokenHandler();
380381
var now = DateTime.Now;
381382

382383
// Generate right now and in memory
383-
var newKey = new CryptographicKey(Algorithm.Create(algorithm).WithContentEncryption(encryption));
384-
await _store.Store(new KeyMaterial(newKey));
384+
var newKey = new KeyMaterial(new CryptographicKey(Algorithm.Create(algorithm).WithContentEncryption(encryption)));
385385

386+
await _store.Store(newKey);
386387
// recovered from database
387-
var currentKey = await _store.GetCurrent();
388+
var currentKey = await _store.Get(newKey.KeyId);
388389

389-
newKey.Key.KeyId.Should().Be(currentKey.KeyId);
390+
391+
newKey.KeyId.Should().Be(currentKey.KeyId);
390392
var claims = new ClaimsIdentity(GenerateClaim().Generate(5));
391393
var descriptor = new SecurityTokenDescriptor
392394
{
@@ -442,7 +444,7 @@ public async Task ShouldGenerateAndValidateJweAndJws()
442444

443445
var handler = new JsonWebTokenHandler();
444446
var now = DateTime.Now;
445-
447+
446448
// Generate right now and in memory
447449
var newKey = new CryptographicKey(Algorithm.Create(AlgorithmType.RSA, JwtType.Both));
448450

0 commit comments

Comments
 (0)