Skip to content

Commit f76a8bb

Browse files
committed
feat: no persistence mode
1 parent 27827b7 commit f76a8bb

File tree

12 files changed

+167
-196
lines changed

12 files changed

+167
-196
lines changed

sample/Aguacongas.AspNetCore.Authentication.Sample/Startup.cs

+16-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Diagnostics;
66
using System.Linq;
77
using System.Threading.Tasks;
8+
using Microsoft.AspNetCore.Authentication;
89
using Microsoft.AspNetCore.Builder;
910
using Microsoft.AspNetCore.Hosting;
1011
using Microsoft.AspNetCore.Http;
@@ -13,6 +14,7 @@
1314
using Microsoft.EntityFrameworkCore;
1415
using Microsoft.Extensions.Configuration;
1516
using Microsoft.Extensions.DependencyInjection;
17+
using Microsoft.Extensions.Logging;
1618

1719
namespace Aguacongas.AspNetCore.Authentication.Sample
1820
{
@@ -37,15 +39,24 @@ public void ConfigureServices(IServiceCollection services)
3739

3840
services
3941
.AddAuthentication()
40-
// the order is important, 1st add dynamic, then store, then providers you want to manage dynamically
42+
.AddOpenIdConnect()
43+
// The order is important, 1st add dynamic, then store, then providers you want to manage dynamically.
44+
// OpenIdConnect should appears in managed handlers list, however, if you move it after AddDynamic, it will.
4145
.AddDynamic(options =>
4246
{
43-
options.UseInMemoryDatabase(Guid.NewGuid().ToString());
44-
}, (context) =>
47+
options.UseInMemoryDatabase("sample");
48+
})
49+
.AddGoogle(options =>
4550
{
46-
Debug.WriteLine($"The scheme {context.Scheme} has been {context.Action}");
51+
// You can defined default configuration for managed handlers.
52+
options.Events.OnTicketReceived = context =>
53+
{
54+
var provider = context.HttpContext.RequestServices;
55+
var logger = provider.GetRequiredService<ILogger<TicketReceivedContext>>();
56+
logger.LogInformation($"Ticket received for scheme {context.Scheme}");
57+
return Task.CompletedTask;
58+
};
4759
})
48-
.AddGoogle()
4960
.AddFacebook()
5061
.AddTwitter()
5162
.AddMicrosoftAccount();

src/Aguacongas.AspNetCore.Authentication.EntityFramework/DynamicAuthenticationBuilderExtensions.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ public static class DynamicAuthenticationBuilderExtensions
2020
/// <param name="optionsAction">The options action.</param>
2121
/// <param name="notify">The action to call on scheme added or removed.</param>
2222
/// <returns></returns>
23-
public static DynamicAuthenticationBuilder AddDynamic(this AuthenticationBuilder builder, Action<DbContextOptionsBuilder> optionsAction = null, Action<NotificationContext> notify = null)
23+
public static DynamicAuthenticationBuilder AddDynamic(this AuthenticationBuilder builder, Action<DbContextOptionsBuilder> optionsAction = null)
2424
{
25-
return builder.AddDynamic<SchemeDefinition>(notify)
25+
return builder.AddDynamic<SchemeDefinition>()
2626
.AddEntityFrameworkStore(optionsAction);
2727
}
2828

@@ -34,10 +34,10 @@ public static DynamicAuthenticationBuilder AddDynamic(this AuthenticationBuilder
3434
/// <param name="optionsAction">The db context options builder action.</param>
3535
/// <param name="notify">The action to call on scheme added or removed.</param>
3636
/// <returns></returns>
37-
public static DynamicAuthenticationBuilder AddDynamic<TContext>(this AuthenticationBuilder builder, Action<DbContextOptionsBuilder> optionsAction = null, Action<NotificationContext> notify = null)
37+
public static DynamicAuthenticationBuilder AddDynamic<TContext>(this AuthenticationBuilder builder, Action<DbContextOptionsBuilder> optionsAction = null)
3838
where TContext : SchemeDbContext<SchemeDefinition>
3939
{
40-
return builder.AddDynamic<SchemeDefinition>(notify)
40+
return builder.AddDynamic<SchemeDefinition>()
4141
.AddEntityFrameworkStore<TContext>(optionsAction);
4242
}
4343

@@ -47,11 +47,11 @@ public static DynamicAuthenticationBuilder AddDynamic<TContext>(this Authenticat
4747
/// <typeparam name="TDefinition">The type of the provider definition.</typeparam>
4848
/// <param name="builder">The builder.</param>
4949
/// <returns></returns>
50-
public static DynamicAuthenticationBuilder AddDynamic<TContext, TSchemeDefinition>(this AuthenticationBuilder builder, Action<DbContextOptionsBuilder> optionsAction = null, Action<NotificationContext> notify = null)
50+
public static DynamicAuthenticationBuilder AddDynamic<TContext, TSchemeDefinition>(this AuthenticationBuilder builder, Action<DbContextOptionsBuilder> optionsAction = null)
5151
where TSchemeDefinition: SchemeDefinition, new()
5252
where TContext : SchemeDbContext<TSchemeDefinition>
5353
{
54-
return builder.AddDynamic<TSchemeDefinition>(notify)
54+
return builder.AddDynamic<TSchemeDefinition>()
5555
.AddEntityFrameworkStore<TContext, TSchemeDefinition>(optionsAction);
5656
}
5757

src/Aguacongas.AspNetCore.Authentication.TestBase/DynamicManagerTestBase.cs

+13-21
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ Task onSignId(CookieSignedInContext context)
6262
});
6363
});
6464

65-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
65+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
6666
Assert.Contains(typeof(CookieAuthenticationHandler), sut.ManagedHandlerType);
6767

6868
var cookieOptions = new CookieAuthenticationOptions
@@ -116,7 +116,7 @@ Task onCreatingTicket(OAuthCreatingTicketContext context)
116116
});
117117
});
118118

119-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
119+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
120120
Assert.Contains(typeof(FacebookHandler), sut.ManagedHandlerType);
121121

122122
var facebookOptions = new FacebookOptions
@@ -170,7 +170,7 @@ Task onCreatingTicket(OAuthCreatingTicketContext context)
170170
});
171171
});
172172

173-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
173+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
174174
Assert.Contains(typeof(GoogleHandler), sut.ManagedHandlerType);
175175

176176
var googleOptions = new GoogleOptions
@@ -238,7 +238,7 @@ Task onMessageReceived(Microsoft.AspNetCore.Authentication.JwtBearer.MessageRece
238238
Options = jwtBearerOptions
239239
};
240240

241-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
241+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
242242
Assert.Contains(typeof(JwtBearerHandler), sut.ManagedHandlerType);
243243

244244
await sut.AddAsync(definition);
@@ -289,7 +289,7 @@ Task onCreatingTicket(OAuthCreatingTicketContext context)
289289
Options = msAccountOptions
290290
};
291291

292-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
292+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
293293
Assert.Contains(typeof(MicrosoftAccountHandler), sut.ManagedHandlerType);
294294

295295
await sut.AddAsync(definition);
@@ -344,7 +344,7 @@ Task onTicketReceived(TicketReceivedContext context)
344344
Options = oidcptions
345345
};
346346

347-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
347+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
348348
Assert.Contains(typeof(OpenIdConnectHandler), sut.ManagedHandlerType);
349349

350350
await sut.AddAsync(definition);
@@ -396,7 +396,7 @@ Task onTicketReceived(TicketReceivedContext context)
396396
Options = twittertOptions
397397
};
398398

399-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
399+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
400400
Assert.Contains(typeof(TwitterHandler), sut.ManagedHandlerType);
401401

402402
await sut.AddAsync(definition);
@@ -450,7 +450,7 @@ Task onTicketReceived(TicketReceivedContext context)
450450
Options = wsFederationOptions
451451
};
452452

453-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
453+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
454454
Assert.Contains(typeof(WsFederationHandler), sut.ManagedHandlerType);
455455

456456
await sut.AddAsync(definition);
@@ -504,7 +504,7 @@ Task onTicketReceived(TicketReceivedContext context)
504504
Options = cookieOptions
505505
};
506506

507-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
507+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
508508
Assert.Contains(typeof(CookieAuthenticationHandler), sut.ManagedHandlerType);
509509
Assert.Contains(typeof(WsFederationHandler), sut.ManagedHandlerType);
510510

@@ -568,14 +568,14 @@ public async Task RemoveAsync_should_remove_handler()
568568
Options = cookieOptions
569569
};
570570

571-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
571+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
572572
Assert.Contains(typeof(CookieAuthenticationHandler), sut.ManagedHandlerType);
573573

574574
await sut.AddAsync(definition);
575575
await VerifyAddedAsync<CookieAuthenticationOptions>("test", provider);
576576

577577
await sut.RemoveAsync("test");
578-
await Assert.ThrowsAsync<NotNullException>(() => VerifyAddedAsync<WsFederationOptions>("test", provider));
578+
await Assert.ThrowsAsync<NullReferenceException>(() => VerifyAddedAsync<WsFederationOptions>("test", provider));
579579
}
580580

581581
[Fact]
@@ -605,15 +605,14 @@ public async Task Load_should_load_configuration()
605605

606606
await store.AddAsync(definition);
607607

608-
var sut = provider.GetRequiredService<DynamicManager<TSchemeDefinition>>();
608+
var sut = provider.GetRequiredService<PersistentDynamicManager<TSchemeDefinition>>();
609609

610610
sut.Load();
611611

612612
await VerifyAddedAsync<CookieAuthenticationOptions>("test", provider);
613613
}
614614
protected abstract DynamicAuthenticationBuilder AddStore(DynamicAuthenticationBuilder builder);
615615

616-
private bool notifyMethodCalled;
617616
private async Task<dynamic> VerifyAddedAsync<TOptions>(string schemeName, IServiceProvider provider) where TOptions : AuthenticationSchemeOptions
618617
{
619618
var store = provider.GetRequiredService<IDynamicProviderStore<TSchemeDefinition>>();
@@ -627,7 +626,6 @@ private async Task<dynamic> VerifyAddedAsync<TOptions>(string schemeName, IServi
627626
var options = optionsMonitorCache.GetOrAdd(schemeName, () => default(TOptions));
628627
Assert.NotNull(options);
629628

630-
Assert.True(notifyMethodCalled);
631629
return new { definition, scheme, options };
632630
}
633631

@@ -640,18 +638,12 @@ private IServiceProvider CreateServiceProvider(Action<AuthenticationBuilder> add
640638
.AddDebug();
641639
})
642640
.AddAuthentication()
643-
.AddDynamic<TSchemeDefinition>(notify: context =>
644-
{
645-
_output.WriteLine($"{context.Scheme} has been {context.Action}");
646-
notifyMethodCalled = true;
647-
});
641+
.AddDynamic<TSchemeDefinition>();
648642

649643
AddStore(builder);
650644

651645
addHandlers?.Invoke(builder);
652646

653-
notifyMethodCalled = false;
654-
655647
return services.BuildServiceProvider();
656648
}
657649
}

src/Aguacongas.AspNetCore.Authentication/ApplicationBuilderExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static IServiceProvider LoadDynamicAuthenticationConfiguration<TDefinitio
3535
{
3636
using (var scope = provider.CreateScope())
3737
{
38-
var manager = scope.ServiceProvider.GetRequiredService<DynamicManager<TDefinition>>();
38+
var manager = scope.ServiceProvider.GetRequiredService<PersistentDynamicManager<TDefinition>>();
3939
manager.Load();
4040
}
4141
return provider;

src/Aguacongas.AspNetCore.Authentication/AuthenticationBuilderExtensions.cs

+10-5
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,25 @@ public static class AuthenticationBuilderExtensions
1818
/// <param name="builder">The builder.</param>
1919
/// <param name="notify">The action to call on scheme added or removed.</param>
2020
/// <returns></returns>
21-
public static DynamicAuthenticationBuilder AddDynamic<TSchemeDefinition>(this AuthenticationBuilder builder, Action<NotificationContext> notify = null)
21+
public static DynamicAuthenticationBuilder AddDynamic<TSchemeDefinition>(this AuthenticationBuilder builder)
2222
where TSchemeDefinition: SchemeDefinitionBase, new()
2323
{
24-
var dynamicBuilder = new DynamicAuthenticationBuilder(builder.Services, notify);
24+
var dynamicBuilder = new DynamicAuthenticationBuilder(builder.Services);
2525
builder.Services
2626
.AddSingleton<OptionsMonitorCacheWrapperFactory>()
27-
.AddTransient(provider => new DynamicManager<TSchemeDefinition>
27+
.AddTransient(provider => new PersistentDynamicManager<TSchemeDefinition>
2828
(
2929
provider.GetRequiredService<IAuthenticationSchemeProvider>(),
3030
provider.GetRequiredService<OptionsMonitorCacheWrapperFactory>(),
3131
provider.GetRequiredService<IDynamicProviderStore<TSchemeDefinition>>(),
3232
dynamicBuilder.HandlerTypes
33-
)
34-
);
33+
))
34+
.AddTransient(provider => new DynamicManager<TSchemeDefinition>
35+
(
36+
provider.GetRequiredService<IAuthenticationSchemeProvider>(),
37+
provider.GetRequiredService<OptionsMonitorCacheWrapperFactory>(),
38+
dynamicBuilder.HandlerTypes
39+
));
3540
return dynamicBuilder;
3641
}
3742
}

src/Aguacongas.AspNetCore.Authentication/DynamicAuthenticationBuilder.cs

+2-12
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,12 @@
88

99
namespace Aguacongas.AspNetCore.Authentication
1010
{
11-
public enum SchemeAction
12-
{
13-
Added,
14-
Removed
15-
}
1611
/// <summary>
1712
/// Configure the DI for dynamic scheme management.
1813
/// </summary>
1914
/// <seealso cref="Microsoft.AspNetCore.Authentication.AuthenticationBuilder" />
2015
public class DynamicAuthenticationBuilder : AuthenticationBuilder
2116
{
22-
private readonly Action<NotificationContext> _notify;
2317
private readonly List<Type> _handlerTypes = new List<Type>();
2418

2519
/// <summary>
@@ -34,10 +28,8 @@ public class DynamicAuthenticationBuilder : AuthenticationBuilder
3428
/// Initializes a new instance of the <see cref="DynamicAuthenticationBuilder"/> class.
3529
/// </summary>
3630
/// <param name="services">The services.</param>
37-
/// <param name="notify">The notify.</param>
38-
public DynamicAuthenticationBuilder(IServiceCollection services, Action<NotificationContext> notify): base(services)
31+
public DynamicAuthenticationBuilder(IServiceCollection services): base(services)
3932
{
40-
_notify = notify;
4133
HandlerTypes = _handlerTypes;
4234
}
4335

@@ -62,9 +54,7 @@ public override AuthenticationBuilder AddScheme<TOptions, THandler>(string authe
6254
(name, configure) =>
6355
{
6456
configureOptions?.Invoke((TOptions)configure);
65-
_notify?.Invoke(new NotificationContext(provider, name, SchemeAction.Added));
66-
},
67-
name => _notify?.Invoke(new NotificationContext(provider, name, SchemeAction.Removed))
57+
}
6858
)
6959
);
7060
base.AddScheme<TOptions, THandler>(authenticationScheme, displayName, configureOptions);

0 commit comments

Comments
 (0)