Skip to content

Commit 957ecee

Browse files
committed
feat: load store configuration
1 parent 04debb3 commit 957ecee

File tree

2 files changed

+157
-10
lines changed

2 files changed

+157
-10
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using Aguacongas.AspNetCore.Authentication;
2+
using Microsoft.Extensions.DependencyInjection;
3+
4+
namespace Microsoft.AspNetCore.Builder
5+
{
6+
public static class ApplicationBuilderExtensions
7+
{
8+
/// <summary>
9+
/// Loads the dynamic authentication configuration.
10+
/// </summary>
11+
/// <param name="builder">The builder.</param>
12+
/// <returns></returns>
13+
public static IApplicationBuilder LoadDynamicAuthenticationConfiguration(this IApplicationBuilder builder)
14+
{
15+
return LoadDynamicAuthenticationConfiguration<ProviderDefinition>(builder);
16+
}
17+
18+
/// <summary>
19+
/// Loads the dynamic authentication configuration.
20+
/// </summary>
21+
/// <typeparam name="TDefinition">The type of the definition.</typeparam>
22+
/// <param name="builder">The builder.</param>
23+
/// <returns></returns>
24+
public static IApplicationBuilder LoadDynamicAuthenticationConfiguration<TDefinition>(this IApplicationBuilder builder)
25+
where TDefinition: ProviderDefinition, new()
26+
{
27+
var manager = builder.ApplicationServices.GetRequiredService<DynamicManager<TDefinition>>();
28+
manager.Load();
29+
return builder;
30+
}
31+
}
32+
}

test/Aguacongas.AspNetCore.Authentication.Test/DynamicManagerTest.cs

+125-10
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
using Microsoft.AspNetCore.Authentication.Twitter;
2424
using Microsoft.AspNetCore.Authentication.WsFederation;
2525
using Microsoft.IdentityModel.Protocols.WsFederation;
26+
using Xunit.Sdk;
2627

2728
namespace Aguacongas.AspNetCore.Authentication.Test
2829
{
@@ -52,7 +53,7 @@ Task onSignId(CookieSignedInContext context)
5253
});
5354
});
5455

55-
var sut = provider.GetRequiredService<DynamicManager>();
56+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
5657
var cookieOptions = new CookieAuthenticationOptions
5758
{
5859
Cookie = new CookieBuilder
@@ -61,7 +62,7 @@ Task onSignId(CookieSignedInContext context)
6162
}
6263
};
6364

64-
await sut.AddAsync(CookieAuthenticationDefaults.AuthenticationScheme, "test", typeof(CookieAuthenticationHandler), (AuthenticationSchemeOptions)cookieOptions);
65+
await sut.AddAsync(CookieAuthenticationDefaults.AuthenticationScheme, "test", typeof(CookieAuthenticationHandler), cookieOptions);
6566
var state = await VerifyAddedAsync<CookieAuthenticationOptions>(CookieAuthenticationDefaults.AuthenticationScheme, provider);
6667

6768
var storedOptions = JsonConvert.DeserializeObject<CookieAuthenticationOptions>(state.definition.SerializedOptions);
@@ -97,7 +98,7 @@ Task onCreatingTicket(OAuthCreatingTicketContext context)
9798
});
9899
});
99100

100-
var sut = provider.GetRequiredService<DynamicManager>();
101+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
101102
var facebookOptions = new FacebookOptions
102103
{
103104
AppId = "test",
@@ -142,7 +143,7 @@ Task onCreatingTicket(OAuthCreatingTicketContext context)
142143
});
143144
});
144145

145-
var sut = provider.GetRequiredService<DynamicManager>();
146+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
146147
var googleOptions = new GoogleOptions
147148
{
148149
ClientId = "test",
@@ -188,7 +189,7 @@ Task onMessageReceived(Microsoft.AspNetCore.Authentication.JwtBearer.MessageRece
188189
});
189190
});
190191

191-
var sut = provider.GetRequiredService<DynamicManager>();
192+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
192193
var jwtBearerOptions = new JwtBearerOptions
193194
{
194195
Authority = "test"
@@ -228,7 +229,7 @@ Task onCreatingTicket(OAuthCreatingTicketContext context)
228229
});
229230
});
230231

231-
var sut = provider.GetRequiredService<DynamicManager>();
232+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
232233
var msAccountOptions = new MicrosoftAccountOptions
233234
{
234235
ClientId = "test",
@@ -273,7 +274,7 @@ Task onTicketReceived(TicketReceivedContext context)
273274
});
274275
});
275276

276-
var sut = provider.GetRequiredService<DynamicManager>();
277+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
277278
var msAccountOptions = new OpenIdConnectOptions
278279
{
279280
ClientId = "test",
@@ -315,7 +316,7 @@ Task onTicketReceived(TicketReceivedContext context)
315316
});
316317
});
317318

318-
var sut = provider.GetRequiredService<DynamicManager>();
319+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
319320
var twittertOptions = new TwitterOptions
320321
{
321322
ConsumerKey = "test",
@@ -357,7 +358,7 @@ Task onTicketReceived(TicketReceivedContext context)
357358
});
358359
});
359360

360-
var sut = provider.GetRequiredService<DynamicManager>();
361+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
361362
var wsFederationOptions = new WsFederationOptions
362363
{
363364
Configuration = new WsFederationConfiguration
@@ -382,7 +383,122 @@ Task onTicketReceived(TicketReceivedContext context)
382383

383384
Assert.True(eventCalled);
384385
}
386+
[Fact]
387+
public async Task UpdateAsync_should_update_handler()
388+
{
389+
var eventCalled = false;
390+
Task onTicketReceived(TicketReceivedContext context)
391+
{
392+
eventCalled = true;
393+
return Task.CompletedTask;
394+
}
395+
396+
var provider = CreateServiceProvider(options =>
397+
{
398+
options.AddCookie()
399+
.AddWsFederation(configure =>
400+
{
401+
configure.Events.OnTicketReceived = onTicketReceived;
402+
});
403+
});
404+
405+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
406+
407+
var cookieOptions = new CookieAuthenticationOptions
408+
{
409+
Cookie = new CookieBuilder
410+
{
411+
Domain = "test"
412+
}
413+
};
414+
415+
await sut.AddAsync<CookieAuthenticationHandler, CookieAuthenticationOptions>("test", "test", cookieOptions);
416+
await VerifyAddedAsync<CookieAuthenticationOptions>("test", provider);
417+
418+
var wsFederationOptions = new WsFederationOptions
419+
{
420+
Configuration = new WsFederationConfiguration
421+
{
422+
Issuer = "test"
423+
}
424+
};
425+
426+
await sut.UpdateAsync<WsFederationHandler, WsFederationOptions>("test", "new name", wsFederationOptions);
427+
var state = await VerifyAddedAsync<WsFederationOptions>("test", provider);
428+
429+
var storedOptions = JsonConvert.DeserializeObject<WsFederationOptions>(state.definition.SerializedOptions);
430+
_output.WriteLine(state.definition.SerializedOptions);
431+
432+
Assert.Equal(wsFederationOptions.Configuration.Issuer, storedOptions.Configuration.Issuer);
433+
434+
var httpContext = new Mock<HttpContext>().Object;
435+
state.options.Events.OnTicketReceived(new TicketReceivedContext(
436+
httpContext,
437+
state.scheme as AuthenticationScheme,
438+
state.options as WsFederationOptions,
439+
new AuthenticationTicket(new ClaimsPrincipal(), "test")));
385440

441+
Assert.True(eventCalled);
442+
}
443+
444+
[Fact]
445+
public async Task RemoveAsync_should_remove_handler()
446+
{
447+
var provider = CreateServiceProvider(options =>
448+
{
449+
options.AddCookie();
450+
});
451+
452+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
453+
454+
var cookieOptions = new CookieAuthenticationOptions
455+
{
456+
Cookie = new CookieBuilder
457+
{
458+
Domain = "test"
459+
}
460+
};
461+
462+
await sut.AddAsync<CookieAuthenticationHandler, CookieAuthenticationOptions>("test", "test", cookieOptions);
463+
await VerifyAddedAsync<CookieAuthenticationOptions>("test", provider);
464+
465+
await sut.RemoveAsync("test");
466+
await Assert.ThrowsAsync<NotNullException>(() => VerifyAddedAsync<WsFederationOptions>("test", provider));
467+
}
468+
469+
[Fact]
470+
public async Task Load_should_load_configuration()
471+
{
472+
var provider = CreateServiceProvider(options =>
473+
{
474+
options.AddCookie();
475+
});
476+
477+
var store = provider.GetRequiredService<IDynamicProviderStore<ProviderDefinition>>();
478+
479+
var cookieOptions = new CookieAuthenticationOptions
480+
{
481+
Cookie = new CookieBuilder
482+
{
483+
Domain = "test"
484+
}
485+
};
486+
487+
var definition = new ProviderDefinition
488+
{
489+
Id = "test",
490+
HandlerTypeName = typeof(CookieAuthenticationHandler).FullName,
491+
SerializedOptions = JsonConvert.SerializeObject(cookieOptions, DynamicManager<ProviderDefinition>.JsonSerializerSettings)
492+
};
493+
494+
await store.AddAsync(definition);
495+
496+
var sut = provider.GetRequiredService<DynamicManager<ProviderDefinition>>();
497+
498+
sut.Load();
499+
500+
await VerifyAddedAsync<CookieAuthenticationOptions>("test", provider);
501+
}
386502
protected virtual IServiceCollection AddStore(IServiceCollection services)
387503
{
388504
return services.AddEntityFrameworkStore<ProviderDbContext>(options =>
@@ -399,7 +515,6 @@ private static async Task<dynamic> VerifyAddedAsync<TOptions>(string schemeName,
399515
var schemeProvider = provider.GetRequiredService<IAuthenticationSchemeProvider>();
400516
var scheme = await schemeProvider.GetSchemeAsync(schemeName);
401517
Assert.NotNull(scheme);
402-
Assert.Equal("test", scheme.DisplayName);
403518

404519
var optionsMonitorCache = provider.GetRequiredService<IOptionsMonitorCache<TOptions>>();
405520
var options = optionsMonitorCache.GetOrAdd(schemeName, () => default(TOptions));

0 commit comments

Comments
 (0)