Skip to content

Commit 42d13f0

Browse files
authored
Merge pull request fullstackhero#290 from jnalley20/proxy-nginx
Behind SSL Proxy. Adds Cors policy, forwarded headers and known proxy
2 parents 2ca3641 + 3b5f3fe commit 42d13f0

File tree

6 files changed

+73
-5
lines changed

6 files changed

+73
-5
lines changed

src/Application/Configurations/AppConfiguration.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@
33
public class AppConfiguration
44
{
55
public string Secret { get; set; }
6+
public bool BehindSSLProxy { get; set; }
7+
public string ProxyIP { get; set; }
8+
public string ApplicationUrl { get; set; }
69
}
710
}

src/Server/Extensions/ApplicationBuilderExtensions.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
using Microsoft.Extensions.DependencyInjection;
1111
using Microsoft.Extensions.Hosting;
1212
using BlazorHero.CleanArchitecture.Shared.Constants.Application;
13+
using BlazorHero.CleanArchitecture.Application.Configurations;
14+
using Microsoft.Extensions.Configuration;
1315

1416
namespace BlazorHero.CleanArchitecture.Server.Extensions
1517
{
@@ -28,6 +30,20 @@ internal static IApplicationBuilder UseExceptionHandling(
2830
return app;
2931
}
3032

33+
internal static IApplicationBuilder AddForwardingOptions(this IApplicationBuilder app, IConfiguration configuration)
34+
{
35+
AppConfiguration config = GetApplicationSettings(configuration);
36+
if (config.BehindSSLProxy)
37+
{
38+
app.UseCors();
39+
app.UseForwardedHeaders();
40+
41+
return app;
42+
}
43+
else
44+
return app;
45+
}
46+
3147
internal static void ConfigureSwagger(this IApplicationBuilder app)
3248
{
3349
app.UseSwagger();
@@ -77,5 +93,11 @@ internal static IApplicationBuilder Initialize(this IApplicationBuilder app, Mic
7793

7894
return app;
7995
}
96+
97+
private static AppConfiguration GetApplicationSettings(IConfiguration configuration)
98+
{
99+
var applicationSettingsConfiguration = configuration.GetSection(nameof(AppConfiguration));
100+
return applicationSettingsConfiguration.Get<AppConfiguration>();
101+
}
80102
}
81103
}

src/Server/Extensions/ServiceCollectionExtensions.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
using BlazorHero.CleanArchitecture.Shared.Constants.Permission;
2525
using BlazorHero.CleanArchitecture.Shared.Wrapper;
2626
using Microsoft.AspNetCore.Authentication.JwtBearer;
27+
using Microsoft.AspNetCore.Builder;
2728
using Microsoft.AspNetCore.Http;
29+
using Microsoft.AspNetCore.HttpOverrides;
2830
using Microsoft.AspNetCore.Identity;
2931
using Microsoft.EntityFrameworkCore;
3032
using Microsoft.Extensions.Configuration;
@@ -34,6 +36,7 @@
3436
using Microsoft.IdentityModel.Tokens;
3537
using Microsoft.OpenApi.Models;
3638
using Newtonsoft.Json;
39+
using Serilog;
3740
using System;
3841
using System.Collections.Generic;
3942
using System.Globalization;
@@ -57,6 +60,43 @@ internal static async Task<IStringLocalizer> GetRegisteredServerLocalizerAsync<T
5760
await serviceProvider.DisposeAsync();
5861
return localizer;
5962
}
63+
internal static IServiceCollection AddForwardingOptions(this IServiceCollection services, IConfiguration configuration)
64+
{
65+
var applicationSettingsConfiguration = configuration.GetSection(nameof(AppConfiguration));
66+
AppConfiguration config = applicationSettingsConfiguration.Get<AppConfiguration>();
67+
if (config.BehindSSLProxy)
68+
{
69+
services.Configure<ForwardedHeadersOptions>(options =>
70+
{
71+
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
72+
if (config.ProxyIP != "")
73+
{
74+
string ipCheck = config.ProxyIP;
75+
if (IPAddress.TryParse(ipCheck, out IPAddress proxyIP))
76+
options.KnownProxies.Add(proxyIP);
77+
else
78+
Log.Logger.Warning($"Invalid Proxy IP of \"{ipCheck}\", Not Loaded");
79+
}
80+
});
81+
82+
services.AddCors(options =>
83+
{
84+
options.AddDefaultPolicy(
85+
builder =>
86+
{
87+
builder
88+
.AllowCredentials()
89+
.AllowAnyHeader()
90+
.AllowAnyMethod()
91+
.WithOrigins(config.ApplicationUrl.TrimEnd('/'));
92+
});
93+
});
94+
95+
return services;
96+
}
97+
else
98+
return services;
99+
}
60100

61101
private static async Task SetCultureFromServerPreferenceAsync(IServiceProvider serviceProvider)
62102
{

src/Server/Server.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<NoWarn>1701;1702;1591</NoWarn>
1111
<UserSecretsId>aa8b7360-671b-4ab2-99b0-7df28629ef3d</UserSecretsId>
1212
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
13-
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
13+
<DockerComposeProjectPath>..\..\docker-compose.dcproj</DockerComposeProjectPath>
1414
<DockerfileContext>..\..</DockerfileContext>
1515
</PropertyGroup>
1616
<ItemGroup>

src/Server/Startup.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ public Startup(IConfiguration configuration)
3131

3232
public void ConfigureServices(IServiceCollection services)
3333
{
34-
services.AddCors();
35-
services.AddSignalR();
34+
services.AddForwardingOptions(_configuration);
3635
services.AddLocalization(options =>
3736
{
3837
options.ResourcesPath = "Resources";
@@ -45,6 +44,7 @@ public void ConfigureServices(IServiceCollection services)
4544
services.AddServerLocalization();
4645
services.AddIdentity();
4746
services.AddJwtAuthentication(services.GetApplicationSettings(_configuration));
47+
services.AddSignalR();
4848
services.AddApplicationLayer();
4949
services.AddApplicationServices();
5050
services.AddRepositories();
@@ -69,7 +69,7 @@ public void ConfigureServices(IServiceCollection services)
6969

7070
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IStringLocalizer<Startup> localizer)
7171
{
72-
app.UseCors();
72+
app.AddForwardingOptions(_configuration);
7373
app.UseExceptionHandling(env);
7474
app.UseHttpsRedirection();
7575
app.UseMiddleware<ErrorHandlerMiddleware>();

src/Server/appsettings.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
},
1010
"AllowedHosts": "*",
1111
"AppConfiguration": {
12-
"Secret": "S0M3RAN0MS3CR3T!1!MAG1C!1!"
12+
"Secret": "S0M3RAN0MS3CR3T!1!MAG1C!1!",
13+
"BehindSSLProxy": false,
14+
"ProxyIP": "",
15+
"ApplicationUrl": ""
1316
},
1417
"ConnectionStrings": {
1518
"DefaultConnection": "Data Source=(localdb)\\mssqllocaldb;Initial Catalog=BlazorHero.CleanArchitecture;Integrated Security=True;MultipleActiveResultSets=True"

0 commit comments

Comments
 (0)