mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 15:30:49 +08:00 
			
		
		
		
	Feat/monorepo (#734)
* copied everything from repos back to ocelot repo * added src projects to sln * removed all test projects that have no tests * added all test projects to sln * removed test not on master * merged unit tests * merged acceptance tests * merged integration tests * fixed namepaces * build script creates packages for all projects * updated docs to make sure no references to external repos that we will remove * +semver: breaking
This commit is contained in:
		
							
								
								
									
										14
									
								
								src/Ocelot.Administration/IIdentityServerConfiguration.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/Ocelot.Administration/IIdentityServerConfiguration.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
namespace Ocelot.Administration
 | 
			
		||||
{
 | 
			
		||||
    using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
    public interface IIdentityServerConfiguration
 | 
			
		||||
    {
 | 
			
		||||
        string ApiName { get;  }
 | 
			
		||||
        string ApiSecret { get;  }
 | 
			
		||||
        bool RequireHttps { get;  }
 | 
			
		||||
        List<string> AllowedScopes { get;  }
 | 
			
		||||
        string CredentialsSigningCertificateLocation { get; }
 | 
			
		||||
        string CredentialsSigningCertificatePassword { get; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								src/Ocelot.Administration/IdentityServerConfiguration.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/Ocelot.Administration/IdentityServerConfiguration.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
namespace Ocelot.Administration
 | 
			
		||||
{
 | 
			
		||||
    using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
    public class IdentityServerConfiguration : IIdentityServerConfiguration
 | 
			
		||||
    {
 | 
			
		||||
        public IdentityServerConfiguration(
 | 
			
		||||
            string apiName, 
 | 
			
		||||
            bool requireHttps, 
 | 
			
		||||
            string apiSecret,
 | 
			
		||||
            List<string> allowedScopes,
 | 
			
		||||
            string credentialsSigningCertificateLocation, 
 | 
			
		||||
            string credentialsSigningCertificatePassword)
 | 
			
		||||
        {
 | 
			
		||||
            ApiName = apiName;
 | 
			
		||||
            RequireHttps = requireHttps;
 | 
			
		||||
            ApiSecret = apiSecret;
 | 
			
		||||
            AllowedScopes = allowedScopes;
 | 
			
		||||
            CredentialsSigningCertificateLocation = credentialsSigningCertificateLocation;
 | 
			
		||||
            CredentialsSigningCertificatePassword = credentialsSigningCertificatePassword;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public string ApiName { get; }
 | 
			
		||||
        public bool RequireHttps { get; }
 | 
			
		||||
        public List<string> AllowedScopes { get; }
 | 
			
		||||
        public string ApiSecret { get; }
 | 
			
		||||
        public string CredentialsSigningCertificateLocation { get; }
 | 
			
		||||
        public string CredentialsSigningCertificatePassword { get; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,23 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
namespace Ocelot.Administration
 | 
			
		||||
{
 | 
			
		||||
    public static class IdentityServerConfigurationCreator
 | 
			
		||||
    {
 | 
			
		||||
        public static IdentityServerConfiguration GetIdentityServerConfiguration(string secret)
 | 
			
		||||
        {
 | 
			
		||||
            var credentialsSigningCertificateLocation = Environment.GetEnvironmentVariable("OCELOT_CERTIFICATE");
 | 
			
		||||
            var credentialsSigningCertificatePassword = Environment.GetEnvironmentVariable("OCELOT_CERTIFICATE_PASSWORD");
 | 
			
		||||
 | 
			
		||||
            return new IdentityServerConfiguration(
 | 
			
		||||
                "admin",
 | 
			
		||||
                false,
 | 
			
		||||
                secret,
 | 
			
		||||
                new List<string> { "admin", "openid", "offline_access" },
 | 
			
		||||
                credentialsSigningCertificateLocation,
 | 
			
		||||
                credentialsSigningCertificatePassword
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
namespace Ocelot.Administration
 | 
			
		||||
{
 | 
			
		||||
    using System.Threading.Tasks;
 | 
			
		||||
    using Configuration;
 | 
			
		||||
    using Configuration.Repository;
 | 
			
		||||
    using Microsoft.AspNetCore.Builder;
 | 
			
		||||
    using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
    using Ocelot.Middleware;
 | 
			
		||||
 | 
			
		||||
    public static class IdentityServerMiddlewareConfigurationProvider
 | 
			
		||||
    {
 | 
			
		||||
        public static OcelotMiddlewareConfigurationDelegate Get = builder =>
 | 
			
		||||
        {
 | 
			
		||||
            var internalConfigRepo = builder.ApplicationServices.GetService<IInternalConfigurationRepository>();
 | 
			
		||||
 | 
			
		||||
            var config = internalConfigRepo.Get();
 | 
			
		||||
 | 
			
		||||
            if (!string.IsNullOrEmpty(config.Data.AdministrationPath))
 | 
			
		||||
            {
 | 
			
		||||
                builder.Map(config.Data.AdministrationPath, app =>
 | 
			
		||||
                {
 | 
			
		||||
                    //todo - hack so we know that we are using internal identity server
 | 
			
		||||
                    var identityServerConfiguration = builder.ApplicationServices.GetService<IIdentityServerConfiguration>();
 | 
			
		||||
 | 
			
		||||
                    if (identityServerConfiguration != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        app.UseIdentityServer();
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    app.UseAuthentication();
 | 
			
		||||
                    app.UseMvc();
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return Task.CompletedTask;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								src/Ocelot.Administration/Ocelot.Administration.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/Ocelot.Administration/Ocelot.Administration.csproj
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
<Project Sdk="Microsoft.NET.Sdk">
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <TargetFramework>netstandard2.0</TargetFramework>
 | 
			
		||||
    <RuntimeFrameworkVersion>2.0.0</RuntimeFrameworkVersion>
 | 
			
		||||
    <NETStandardImplicitPackageVersion>2.0.0</NETStandardImplicitPackageVersion>
 | 
			
		||||
    <NoPackageAnalysis>true</NoPackageAnalysis>
 | 
			
		||||
    <Description>Provides Ocelot extensions to use the administration API and IdentityService dependencies that come with it</Description>
 | 
			
		||||
    <AssemblyTitle>Ocelot.Administration</AssemblyTitle>
 | 
			
		||||
    <VersionPrefix>0.0.0-dev</VersionPrefix>
 | 
			
		||||
    <AssemblyName>Ocelot.Administration</AssemblyName>
 | 
			
		||||
    <PackageId>Ocelot.Administration</PackageId>
 | 
			
		||||
    <PackageTags>API Gateway;.NET core</PackageTags>
 | 
			
		||||
    <PackageProjectUrl>https://github.com/ThreeMammals/Ocelot.Administration</PackageProjectUrl>
 | 
			
		||||
    <PackageProjectUrl>https://github.com/ThreeMammals/Ocelot.Administration</PackageProjectUrl>
 | 
			
		||||
    <PackageIconUrl>http://threemammals.com/images/ocelot_logo.png</PackageIconUrl>
 | 
			
		||||
    <RuntimeIdentifiers>win10-x64;osx.10.11-x64;osx.10.12-x64;win7-x64</RuntimeIdentifiers>
 | 
			
		||||
    <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
 | 
			
		||||
    <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
 | 
			
		||||
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
 | 
			
		||||
    <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
 | 
			
		||||
    <Authors>Tom Pallister</Authors>
 | 
			
		||||
    <CodeAnalysisRuleSet>..\..\codeanalysis.ruleset</CodeAnalysisRuleSet>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
 | 
			
		||||
    <DebugType>full</DebugType>
 | 
			
		||||
    <DebugSymbols>True</DebugSymbols>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ProjectReference Include="..\Ocelot\Ocelot.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="StyleCop.Analyzers" Version="1.0.2">
 | 
			
		||||
      <PrivateAssets>all</PrivateAssets>
 | 
			
		||||
    </PackageReference>
 | 
			
		||||
    <PackageReference Include="IdentityServer4.AccessTokenValidation" Version="2.6.0" />
 | 
			
		||||
    <PackageReference Include="IdentityServer4" Version="2.2.0" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
							
								
								
									
										128
									
								
								src/Ocelot.Administration/OcelotBuilderExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								src/Ocelot.Administration/OcelotBuilderExtensions.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,128 @@
 | 
			
		||||
namespace Ocelot.Administration
 | 
			
		||||
{
 | 
			
		||||
    using System;
 | 
			
		||||
    using System.Collections.Generic;
 | 
			
		||||
    using System.IdentityModel.Tokens.Jwt;
 | 
			
		||||
    using System.Linq;
 | 
			
		||||
    using System.Security.Cryptography.X509Certificates;
 | 
			
		||||
    using Configuration;
 | 
			
		||||
    using Configuration.Creator;
 | 
			
		||||
    using DependencyInjection;
 | 
			
		||||
    using IdentityModel;
 | 
			
		||||
    using IdentityServer4.AccessTokenValidation;
 | 
			
		||||
    using IdentityServer4.Models;
 | 
			
		||||
    using Microsoft.AspNetCore.Builder;
 | 
			
		||||
    using Microsoft.Extensions.Configuration;
 | 
			
		||||
    using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
    using Microsoft.Extensions.DependencyInjection.Extensions;
 | 
			
		||||
    using Ocelot.Middleware;
 | 
			
		||||
 | 
			
		||||
    public static class OcelotBuilderExtensions
 | 
			
		||||
    {
 | 
			
		||||
        public static IOcelotAdministrationBuilder AddAdministration(this IOcelotBuilder builder, string path, string secret)
 | 
			
		||||
        {
 | 
			
		||||
            var administrationPath = new AdministrationPath(path);
 | 
			
		||||
            builder.Services.AddSingleton<OcelotMiddlewareConfigurationDelegate>(IdentityServerMiddlewareConfigurationProvider.Get);
 | 
			
		||||
 | 
			
		||||
            //add identity server for admin area
 | 
			
		||||
            var identityServerConfiguration = IdentityServerConfigurationCreator.GetIdentityServerConfiguration(secret);
 | 
			
		||||
 | 
			
		||||
            if (identityServerConfiguration != null)
 | 
			
		||||
            {
 | 
			
		||||
                AddIdentityServer(identityServerConfiguration, administrationPath, builder, builder.Configuration);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            builder.Services.AddSingleton<IAdministrationPath>(administrationPath);
 | 
			
		||||
            return new OcelotAdministrationBuilder(builder.Services, builder.Configuration);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static IOcelotAdministrationBuilder AddAdministration(this IOcelotBuilder builder, string path, Action<IdentityServerAuthenticationOptions> configureOptions)
 | 
			
		||||
        {
 | 
			
		||||
            var administrationPath = new AdministrationPath(path);
 | 
			
		||||
            builder.Services.AddSingleton<OcelotMiddlewareConfigurationDelegate>(IdentityServerMiddlewareConfigurationProvider.Get);
 | 
			
		||||
 | 
			
		||||
            if (configureOptions != null)
 | 
			
		||||
            {
 | 
			
		||||
                AddIdentityServer(configureOptions, builder);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            builder.Services.AddSingleton<IAdministrationPath>(administrationPath);
 | 
			
		||||
            return new OcelotAdministrationBuilder(builder.Services, builder.Configuration);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static void AddIdentityServer(Action<IdentityServerAuthenticationOptions> configOptions, IOcelotBuilder builder)
 | 
			
		||||
        {
 | 
			
		||||
            builder.Services
 | 
			
		||||
                .AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
 | 
			
		||||
                .AddIdentityServerAuthentication(configOptions);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static void AddIdentityServer(IIdentityServerConfiguration identityServerConfiguration, IAdministrationPath adminPath, IOcelotBuilder builder, IConfiguration configuration)
 | 
			
		||||
        {
 | 
			
		||||
            builder.Services.TryAddSingleton<IIdentityServerConfiguration>(identityServerConfiguration);
 | 
			
		||||
            var identityServerBuilder = builder.Services
 | 
			
		||||
                .AddIdentityServer(o => {
 | 
			
		||||
                    o.IssuerUri = "Ocelot";
 | 
			
		||||
                })
 | 
			
		||||
                .AddInMemoryApiResources(Resources(identityServerConfiguration))
 | 
			
		||||
                .AddInMemoryClients(Client(identityServerConfiguration));
 | 
			
		||||
 | 
			
		||||
            var urlFinder = new BaseUrlFinder(configuration);
 | 
			
		||||
            var baseSchemeUrlAndPort = urlFinder.Find();
 | 
			
		||||
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
 | 
			
		||||
 | 
			
		||||
            builder.Services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
 | 
			
		||||
                .AddIdentityServerAuthentication(o =>
 | 
			
		||||
                {
 | 
			
		||||
                    o.Authority = baseSchemeUrlAndPort + adminPath.Path;
 | 
			
		||||
                    o.ApiName = identityServerConfiguration.ApiName;
 | 
			
		||||
                    o.RequireHttpsMetadata = identityServerConfiguration.RequireHttps;
 | 
			
		||||
                    o.SupportedTokens = SupportedTokens.Both;
 | 
			
		||||
                    o.ApiSecret = identityServerConfiguration.ApiSecret;
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            //todo - refactor naming..
 | 
			
		||||
            if (string.IsNullOrEmpty(identityServerConfiguration.CredentialsSigningCertificateLocation) || string.IsNullOrEmpty(identityServerConfiguration.CredentialsSigningCertificatePassword))
 | 
			
		||||
            {
 | 
			
		||||
                identityServerBuilder.AddDeveloperSigningCredential();
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                //todo - refactor so calls method?
 | 
			
		||||
                var cert = new X509Certificate2(identityServerConfiguration.CredentialsSigningCertificateLocation, identityServerConfiguration.CredentialsSigningCertificatePassword);
 | 
			
		||||
                identityServerBuilder.AddSigningCredential(cert);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static List<ApiResource> Resources(IIdentityServerConfiguration identityServerConfiguration)
 | 
			
		||||
        {
 | 
			
		||||
            return new List<ApiResource>
 | 
			
		||||
            {
 | 
			
		||||
                new ApiResource(identityServerConfiguration.ApiName, identityServerConfiguration.ApiName)
 | 
			
		||||
                {
 | 
			
		||||
                    ApiSecrets = new List<Secret>
 | 
			
		||||
                    {
 | 
			
		||||
                        new Secret
 | 
			
		||||
                        {
 | 
			
		||||
                            Value = identityServerConfiguration.ApiSecret.Sha256()
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static List<Client> Client(IIdentityServerConfiguration identityServerConfiguration)
 | 
			
		||||
        {
 | 
			
		||||
            return new List<Client>
 | 
			
		||||
            {
 | 
			
		||||
                new Client
 | 
			
		||||
                {
 | 
			
		||||
                    ClientId = identityServerConfiguration.ApiName,
 | 
			
		||||
                    AllowedGrantTypes = GrantTypes.ClientCredentials,
 | 
			
		||||
                    ClientSecrets = new List<Secret> {new Secret(identityServerConfiguration.ApiSecret.Sha256())},
 | 
			
		||||
                    AllowedScopes = { identityServerConfiguration.ApiName }
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								src/Ocelot.Administration/Properties/AssemblyInfo.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/Ocelot.Administration/Properties/AssemblyInfo.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Runtime.InteropServices;
 | 
			
		||||
 | 
			
		||||
// General Information about an assembly is controlled through the following
 | 
			
		||||
// set of attributes. Change these attribute values to modify the information
 | 
			
		||||
// associated with an assembly.
 | 
			
		||||
[assembly: AssemblyConfiguration("")]
 | 
			
		||||
[assembly: AssemblyCompany("")]
 | 
			
		||||
[assembly: AssemblyProduct("Ocelot")]
 | 
			
		||||
[assembly: AssemblyTrademark("")]
 | 
			
		||||
 | 
			
		||||
// Setting ComVisible to false makes the types in this assembly not visible
 | 
			
		||||
// to COM components.  If you need to access a type in this assembly from
 | 
			
		||||
// COM, set the ComVisible attribute to true on that type.
 | 
			
		||||
[assembly: ComVisible(false)]
 | 
			
		||||
 | 
			
		||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
 | 
			
		||||
[assembly: Guid("d6df4206-0dba-41d8-884d-c3e08290fdbb")]
 | 
			
		||||
		Reference in New Issue
	
	Block a user