dynamic authority.

This commit is contained in:
David Lebee 2020-07-23 13:10:32 -04:00
parent d06df142e8
commit a8c995cb64
5 changed files with 93 additions and 0 deletions

View File

@ -0,0 +1,37 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.IdentityModel.Protocols;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace PoweredSoft.DynamicJwtBearer.DynamicAuthority
{
public class DynamicAuthorityJwtBearerHandlerConfigurationResolver : IDynamicJwtBearerHanderConfigurationResolver
{
private readonly IMemoryCache memoryCache;
private readonly IDynamicJwtBearerAuthorityResolver dynamicJwtAuthorityResolver;
public DynamicAuthorityJwtBearerHandlerConfigurationResolver(IMemoryCache memoryCache, IDynamicJwtBearerAuthorityResolver dynamicJwtAuthorityResolver)
{
this.memoryCache = memoryCache;
this.dynamicJwtAuthorityResolver = dynamicJwtAuthorityResolver;
}
public async Task<OpenIdConnectConfiguration> ResolveCurrentOpenIdConfiguration(HttpContext context)
{
var authority = await dynamicJwtAuthorityResolver.ResolveAuthority(context);
var cacheKey = $"DynamicAuthorityJwtBearerHandlerConfigurationResolver__{authority}";
var ret = await memoryCache.GetOrCreateAsync(cacheKey, async cacheEntry =>
{
cacheEntry.AbsoluteExpirationRelativeToNow = dynamicJwtAuthorityResolver.ExpirationOfConfiguration;
var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>($"{authority}/.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever());
var authorityConfiguration = await configurationManager.GetConfigurationAsync(context.RequestAborted);
return authorityConfiguration;
});
return ret;
}
}
}

View File

@ -0,0 +1,13 @@
using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;
namespace PoweredSoft.DynamicJwtBearer.DynamicAuthority
{
public interface IDynamicJwtBearerAuthorityResolver
{
public TimeSpan ExpirationOfConfiguration { get; }
public Task<string> ResolveAuthority(HttpContext httpContext);
}
}

View File

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\PoweredSoft.DynamicJwtBearer\PoweredSoft.DynamicJwtBearer.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,26 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;
namespace PoweredSoft.DynamicJwtBearer.DynamicAuthority
{
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddDynamicAuthorityJwtBearerResolver<TAuthoritySolver>(this IServiceCollection services)
where TAuthoritySolver : class, IDynamicJwtBearerAuthorityResolver
{
services.AddTransient<IDynamicJwtBearerAuthorityResolver, TAuthoritySolver>();
services.AddSingleton<IDynamicJwtBearerHanderConfigurationResolver, DynamicAuthorityJwtBearerHandlerConfigurationResolver>();
return services;
}
public static AuthenticationBuilder AddDynamicAuthorityJwtBearerResolver<TAuthoritySolver>(this AuthenticationBuilder authenticationBuilder)
where TAuthoritySolver : class, IDynamicJwtBearerAuthorityResolver
{
authenticationBuilder.Services.AddDynamicAuthorityJwtBearerResolver<TAuthoritySolver>();
return authenticationBuilder;
}
}
}

View File

@ -5,6 +5,8 @@ VisualStudioVersion = 16.0.29503.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoweredSoft.DynamicJwtBearer", "PoweredSoft.DynamicJwtBearer\PoweredSoft.DynamicJwtBearer.csproj", "{0A15F002-66C4-44D1-8162-563F860C49E4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoweredSoft.DynamicJwtBearer.DynamicAuthority", "PoweredSoft.DynamicJwtBearer.DynamicAuthority\PoweredSoft.DynamicJwtBearer.DynamicAuthority.csproj", "{61B13BD6-C86E-4698-8E3B-F26508E9658C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -15,6 +17,10 @@ Global
{0A15F002-66C4-44D1-8162-563F860C49E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0A15F002-66C4-44D1-8162-563F860C49E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A15F002-66C4-44D1-8162-563F860C49E4}.Release|Any CPU.Build.0 = Release|Any CPU
{61B13BD6-C86E-4698-8E3B-F26508E9658C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{61B13BD6-C86E-4698-8E3B-F26508E9658C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{61B13BD6-C86E-4698-8E3B-F26508E9658C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{61B13BD6-C86E-4698-8E3B-F26508E9658C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE