Skip to content

Commit

Permalink
Refactored some of the project infrastructure (#87)
Browse files Browse the repository at this point in the history
* renamed Dependencies to ServiceCollectionExtensions

* moved some appsettings around and refactored service extensions

* token service now has options and was moved to it's own namespace

---------

Co-authored-by: Freddy McGarry <fmcgarry@minitab.com>
  • Loading branch information
fmcgarry and Freddy McGarry committed Jul 12, 2023
1 parent 892658c commit 029044a
Show file tree
Hide file tree
Showing 12 changed files with 215 additions and 158 deletions.
67 changes: 9 additions & 58 deletions src/DateNight.Api/Program.cs
Original file line number Diff line number Diff line change
@@ -1,67 +1,21 @@
using DateNight.Api;
using DateNight.Infrastructure;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Text;

const string DateNightDatabase = "DateNightDatabase";
const string JwtSettings = "JwtSettings";

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Configuration.AddRequiredInfrastructureConfiguration();

builder.Services.AddRequiredInfrastructureServices();
builder.Services.AddIdeaService(builder.Configuration);
builder.Services.AddUserService(builder.Configuration);
builder.Services.AddAppLogger();
builder.Services.AddIdeaService(builder.Configuration.GetSection(DateNightDatabase));
builder.Services.AddUserService(builder.Configuration.GetSection(DateNightDatabase), builder.Configuration.GetSection(JwtSettings));

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
options.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, new OpenApiSecurityScheme()
{
In = ParameterLocation.Header,
Description = "Please provide a valid token",
Name = "Authorization",
Type = SecuritySchemeType.Http,
BearerFormat = "JWT",
Scheme = JwtBearerDefaults.AuthenticationScheme,
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = JwtBearerDefaults.AuthenticationScheme
}
},
Array.Empty<string>()
}
});
});

builder.Services.AddAuthentication().AddJwtBearer(options =>
{
string key = builder.Configuration["JwtSettings:Key"]!;
string issuer = builder.Configuration["JwtSettings:Issuer"]!;
string audience = builder.Configuration["JwtSettings:Audience"]!;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidIssuer = issuer,
ValidAudience = audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)),
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
};
});

builder.Services.AddSwaggerDocumentation();
builder.Services.AddJwtAuthentication(builder.Configuration.GetSection(JwtSettings));
builder.Services.AddApplicationInsightsTelemetry();

var app = builder.Build();
Expand All @@ -74,9 +28,6 @@
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();
67 changes: 67 additions & 0 deletions src/DateNight.Api/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Text;

namespace DateNight.Api;

public static class ServiceCollectionExtensions
{
public static IServiceCollection AddJwtAuthentication(this IServiceCollection services, IConfiguration configurationSection)
{
string key = configurationSection["Key"]!;
string issuer = configurationSection["Issuer"]!;
string audience = configurationSection["Audience"]!;

services.AddAuthentication().AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidIssuer = issuer,
ValidAudience = audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)),
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
};
});

return services;
}

public static IServiceCollection AddSwaggerDocumentation(this IServiceCollection services)
{
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
services.AddEndpointsApiExplorer();
services.AddSwaggerGen(options =>
{
options.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, new OpenApiSecurityScheme()
{
In = ParameterLocation.Header,
Description = "Please provide a valid token",
Name = "Authorization",
Type = SecuritySchemeType.Http,
BearerFormat = "JWT",
Scheme = JwtBearerDefaults.AuthenticationScheme,
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = JwtBearerDefaults.AuthenticationScheme
}
},
Array.Empty<string>()
}
});
});

return services;
}
}
1 change: 0 additions & 1 deletion src/DateNight.Api/appsettings.Development.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
},
"KeyVaultName": "datenight-development",
"JwtSettings": {
"Key": "",
"Issuer": "http://localhost:7000",
"Audience": "http://localhost:7000"
}
Expand Down
4 changes: 1 addition & 3 deletions src/DateNight.Api/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,8 @@
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DateNightDatabase": ""
},
"DateNightDatabase": {
"ConnectionString": "",
"DatabaseId": "",
"IdeasContainer": "",
"UsersContainer": ""
Expand Down
4 changes: 3 additions & 1 deletion src/DateNight.Infrastructure/DateNight.Infrastructure.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
Expand All @@ -12,8 +12,10 @@
<PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.5.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.34.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="7.0.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.31.0" />
</ItemGroup>

Expand Down
77 changes: 0 additions & 77 deletions src/DateNight.Infrastructure/Dependencies.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
using System.ComponentModel.DataAnnotations;

namespace DateNight.Infrastructure.Options;
namespace DateNight.Infrastructure.Repositories;

public class DateNightDatabaseOptions
{
public const string DateNightDatabase = "DateNightDatabase";

[Required]
public string DatabaseId { get; set; } = string.Empty;

[Required]
public string IdeasContainer { get; set; } = string.Empty;

[Required]
public string UsersContainer { get; set; } = string.Empty;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using DateNight.Core.Entities.IdeaAggregate;
using DateNight.Core.Interfaces;
using DateNight.Infrastructure.Options;
using Microsoft.Azure.Cosmos;
using Microsoft.Extensions.Options;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using DateNight.Core.Interfaces;
using DateNight.Infrastructure.Options;
using Microsoft.Azure.Cosmos;
using Microsoft.Extensions.Options;
using User = DateNight.Core.Entities.UserAggregate.User;
Expand Down
Loading

0 comments on commit 029044a

Please sign in to comment.