Skip to content

Commit 97a73f2

Browse files
authored
Merge pull request #76 from marcominerva/develop
Code refactoring
2 parents 04003cc + 64471a5 commit 97a73f2

9 files changed

Lines changed: 76 additions & 70 deletions

File tree

samples/Controllers/ApiKeySample/Program.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
// Add services to the container.
99
builder.Services.AddHttpContextAccessor();
1010
builder.Services.AddControllers();
11+
builder.Services.AddProblemDetails();
1112

1213
builder.Services.AddSimpleAuthentication(builder.Configuration);
1314

@@ -40,9 +41,17 @@
4041
});
4142

4243
var app = builder.Build();
43-
app.UseHttpsRedirection();
4444

4545
// Configure the HTTP request pipeline.
46+
app.UseHttpsRedirection();
47+
48+
app.UseStatusCodePages();
49+
50+
if (!app.Environment.IsDevelopment())
51+
{
52+
app.UseExceptionHandler();
53+
}
54+
4655
if (app.Environment.IsDevelopment())
4756
{
4857
app.UseSwagger();

samples/Controllers/BasicAuthenticationSample/Program.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
// Add services to the container.
1010
builder.Services.AddHttpContextAccessor();
1111
builder.Services.AddControllers();
12+
builder.Services.AddProblemDetails();
1213

1314
builder.Services.AddSimpleAuthentication(builder.Configuration);
1415

@@ -41,9 +42,17 @@
4142
});
4243

4344
var app = builder.Build();
44-
app.UseHttpsRedirection();
4545

4646
// Configure the HTTP request pipeline.
47+
app.UseHttpsRedirection();
48+
49+
app.UseStatusCodePages();
50+
51+
if (!app.Environment.IsDevelopment())
52+
{
53+
app.UseExceptionHandler();
54+
}
55+
4756
if (app.Environment.IsDevelopment())
4857
{
4958
app.UseSwagger();

samples/Controllers/JwtBearerSample/Program.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// Add services to the container.
88
builder.Services.AddHttpContextAccessor();
99
builder.Services.AddControllers();
10+
builder.Services.AddProblemDetails();
1011

1112
builder.Services.AddSimpleAuthentication(builder.Configuration);
1213

@@ -37,9 +38,17 @@
3738
});
3839

3940
var app = builder.Build();
40-
app.UseHttpsRedirection();
4141

4242
// Configure the HTTP request pipeline.
43+
app.UseHttpsRedirection();
44+
45+
app.UseStatusCodePages();
46+
47+
if (!app.Environment.IsDevelopment())
48+
{
49+
app.UseExceptionHandler();
50+
}
51+
4352
if (app.Environment.IsDevelopment())
4453
{
4554
app.UseSwagger();

samples/MinimalApis/ApiKeySample/Program.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
// Add services to the container.
1010
builder.Services.AddHttpContextAccessor();
11+
builder.Services.AddProblemDetails();
1112

1213
builder.Services.AddSimpleAuthentication(builder.Configuration);
1314

@@ -40,9 +41,17 @@
4041
});
4142

4243
var app = builder.Build();
43-
app.UseHttpsRedirection();
4444

4545
// Configure the HTTP request pipeline.
46+
app.UseHttpsRedirection();
47+
48+
app.UseStatusCodePages();
49+
50+
if (!app.Environment.IsDevelopment())
51+
{
52+
app.UseExceptionHandler();
53+
}
54+
4655
if (app.Environment.IsDevelopment())
4756
{
4857
app.UseSwagger();

samples/MinimalApis/BasicAuthenticationSample/Program.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
// Add services to the container.
1010
builder.Services.AddHttpContextAccessor();
11+
builder.Services.AddProblemDetails();
1112

1213
builder.Services.AddSimpleAuthentication(builder.Configuration);
1314

@@ -40,9 +41,17 @@
4041
});
4142

4243
var app = builder.Build();
43-
app.UseHttpsRedirection();
4444

4545
// Configure the HTTP request pipeline.
46+
app.UseHttpsRedirection();
47+
48+
app.UseStatusCodePages();
49+
50+
if (!app.Environment.IsDevelopment())
51+
{
52+
app.UseExceptionHandler();
53+
}
54+
4655
if (app.Environment.IsDevelopment())
4756
{
4857
app.UseSwagger();

samples/MinimalApis/JwtBearerSample/Program.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
// Add services to the container.
1212
builder.Services.AddHttpContextAccessor();
13+
builder.Services.AddProblemDetails();
1314

1415
builder.Services.AddSimpleAuthentication(builder.Configuration);
1516

@@ -42,9 +43,17 @@
4243
});
4344

4445
var app = builder.Build();
45-
app.UseHttpsRedirection();
4646

4747
// Configure the HTTP request pipeline.
48+
app.UseHttpsRedirection();
49+
50+
app.UseStatusCodePages();
51+
52+
if (!app.Environment.IsDevelopment())
53+
{
54+
app.UseExceptionHandler();
55+
}
56+
4857
if (app.Environment.IsDevelopment())
4958
{
5059
app.UseSwagger();

src/SimpleAuthentication.Abstractions/BasicAuthentication/BasicAuthenticationSettings.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ public ICollection<Credential> Credentials
4949

5050
internal set => credentials = value ?? new HashSet<Credential>();
5151
}
52-
53-
internal bool IsConfigured { get; set; }
5452
}
5553

5654
/// <summary>

src/SimpleAuthentication/SimpleAuthenticationExtensions.cs

Lines changed: 16 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -182,22 +182,14 @@ static void CheckAddBasicAuthentication(AuthenticationBuilder builder, IConfigur
182182
throw new ArgumentNullException("One or more credentials contain null values");
183183
}
184184

185-
builder.Services.Configure<BasicAuthenticationSettings>(options =>
186-
{
187-
options.SchemeName = settings.SchemeName;
188-
options.UserName = settings.UserName;
189-
options.Password = settings.Password;
190-
options.Credentials = settings.Credentials;
191-
options.IsConfigured = true;
192-
});
185+
builder.Services.Configure<BasicAuthenticationSettings>(section);
193186

194187
builder.AddScheme<BasicAuthenticationSettings, BasicAuthenticationHandler>(settings.SchemeName, options =>
195188
{
196189
options.SchemeName = settings.SchemeName;
197190
options.UserName = settings.UserName;
198191
options.Password = settings.Password;
199192
options.Credentials = settings.Credentials;
200-
options.IsConfigured = true;
201193
});
202194
}
203195
}
@@ -286,35 +278,25 @@ public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConf
286278
ArgumentNullException.ThrowIfNull(options);
287279
ArgumentNullException.ThrowIfNull(configuration);
288280
ArgumentNullException.ThrowIfNull(sectionName);
289-
ArgumentNullException.ThrowIfNull(additionalSecurityRequirements);
290-
291-
var hasAdditionalSecurityRequirements = additionalSecurityRequirements.Any();
292281

293282
// Adds a security definition for each authentication method that has been configured.
294-
// If we have additional security requirements, a corresponding security requirement will be added for each authentication method.
295-
// Otherwise, we use an operation filter that adds security requirements only to endpoints that actually require authentication
296-
// based on the "Authentication" section configuration.
297-
CheckAddJwtBearer(options, configuration.GetSection($"{sectionName}:JwtBearer"), hasAdditionalSecurityRequirements);
298-
CheckAddApiKey(options, configuration.GetSection($"{sectionName}:ApiKey"), hasAdditionalSecurityRequirements);
299-
CheckAddBasicAuthentication(options, configuration.GetSection($"{sectionName}:Basic"), hasAdditionalSecurityRequirements);
300-
301-
if (hasAdditionalSecurityRequirements)
283+
CheckAddJwtBearer(options, configuration.GetSection($"{sectionName}:JwtBearer"));
284+
CheckAddApiKey(options, configuration.GetSection($"{sectionName}:ApiKey"));
285+
CheckAddBasicAuthentication(options, configuration.GetSection($"{sectionName}:Basic"));
286+
287+
if (additionalSecurityRequirements?.Any() ?? false)
302288
{
303289
// Adds all the other security requirements that have been specified.
304290
foreach (var securityRequirement in additionalSecurityRequirements)
305291
{
306292
options.AddSecurityRequirement(securityRequirement);
307293
}
308294
}
309-
else
310-
{
311-
// This filters automatically adds a security requirement to each endpoint that requires authentication.
312-
options.OperationFilter<AuthenticationOperationFilter>();
313-
}
314295

296+
options.OperationFilter<AuthenticationOperationFilter>();
315297
options.DocumentFilter<ProblemDetailsDocumentFilter>();
316298

317-
static void CheckAddJwtBearer(SwaggerGenOptions options, IConfigurationSection section, bool addSecurityRequirement)
299+
static void CheckAddJwtBearer(SwaggerGenOptions options, IConfigurationSection section)
318300
{
319301
var settings = section.Get<JwtBearerSettings>();
320302
if (settings is null)
@@ -323,10 +305,10 @@ static void CheckAddJwtBearer(SwaggerGenOptions options, IConfigurationSection s
323305
}
324306

325307
AddSecurityDefinition(options, settings.SchemeName, SecuritySchemeType.Http, JwtBearerDefaults.AuthenticationScheme, ParameterLocation.Header, HeaderNames.Authorization, "Insert the Bearer Token");
326-
CheckAddSecurityRequirement(options, addSecurityRequirement ? settings.SchemeName : null);
308+
AddSecurityRequirement(options, settings.SchemeName);
327309
}
328310

329-
static void CheckAddApiKey(SwaggerGenOptions options, IConfigurationSection section, bool addSecurityRequirement)
311+
static void CheckAddApiKey(SwaggerGenOptions options, IConfigurationSection section)
330312
{
331313
var settings = section.Get<ApiKeySettings>();
332314
if (settings is null)
@@ -337,17 +319,17 @@ static void CheckAddApiKey(SwaggerGenOptions options, IConfigurationSection sect
337319
if (!string.IsNullOrWhiteSpace(settings.HeaderName))
338320
{
339321
AddSecurityDefinition(options, $"{settings.SchemeName} in Header", SecuritySchemeType.ApiKey, null, ParameterLocation.Header, settings.HeaderName, "Insert the API Key");
340-
CheckAddSecurityRequirement(options, addSecurityRequirement ? $"{settings.SchemeName} in Header" : null);
322+
AddSecurityRequirement(options, $"{settings.SchemeName} in Header");
341323
}
342324

343325
if (!string.IsNullOrWhiteSpace(settings.QueryStringKey))
344326
{
345327
AddSecurityDefinition(options, $"{settings.SchemeName} in Query String", SecuritySchemeType.ApiKey, null, ParameterLocation.Query, settings.QueryStringKey, "Insert the API Key");
346-
CheckAddSecurityRequirement(options, addSecurityRequirement ? $"{settings.SchemeName} in Query String" : null);
328+
AddSecurityRequirement(options, $"{settings.SchemeName} in Query String");
347329
}
348330
}
349331

350-
static void CheckAddBasicAuthentication(SwaggerGenOptions options, IConfigurationSection section, bool addSecurityRequirement)
332+
static void CheckAddBasicAuthentication(SwaggerGenOptions options, IConfigurationSection section)
351333
{
352334
var settings = section.Get<BasicAuthenticationSettings>();
353335
if (settings is null)
@@ -356,7 +338,7 @@ static void CheckAddBasicAuthentication(SwaggerGenOptions options, IConfiguratio
356338
}
357339

358340
AddSecurityDefinition(options, settings.SchemeName, SecuritySchemeType.Http, BasicAuthenticationDefaults.AuthenticationScheme, ParameterLocation.Header, HeaderNames.Authorization, "Insert user name and password");
359-
CheckAddSecurityRequirement(options, addSecurityRequirement ? settings.SchemeName : null);
341+
AddSecurityRequirement(options, settings.SchemeName);
360342
}
361343

362344
static void AddSecurityDefinition(SwaggerGenOptions options, string name, SecuritySchemeType securitySchemeType, string? scheme, ParameterLocation location, string parameterName, string description)
@@ -369,14 +351,7 @@ static void AddSecurityDefinition(SwaggerGenOptions options, string name, Securi
369351
Scheme = scheme
370352
});
371353

372-
static void CheckAddSecurityRequirement(SwaggerGenOptions options, string? name)
373-
{
374-
if (string.IsNullOrWhiteSpace(name))
375-
{
376-
return;
377-
}
378-
379-
options.AddSecurityRequirement(Helpers.CreateSecurityRequirement(name));
380-
}
354+
static void AddSecurityRequirement(SwaggerGenOptions options, string name)
355+
=> options.AddSecurityRequirement(Helpers.CreateSecurityRequirement(name));
381356
}
382357
}

src/SimpleAuthentication/Swagger/AuthenticationOperationFilter.cs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,29 +41,8 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context)
4141

4242
if ((requireAuthenticatedUser || requireAuthorization) && !allowAnonymous)
4343
{
44-
var hasJwtBearerAuthentication = !string.IsNullOrWhiteSpace(jwtBearerSettings.SecurityKey);
45-
CheckAddSecurityRequirement(operation, hasJwtBearerAuthentication ? jwtBearerSettings.SchemeName : null);
46-
47-
var hasApiKeyHeaderAuthentication = !string.IsNullOrWhiteSpace(apiKeySettings.HeaderName);
48-
var hasApiKeyQueryAuthentication = !string.IsNullOrWhiteSpace(apiKeySettings.QueryStringKey);
49-
CheckAddSecurityRequirement(operation, hasApiKeyHeaderAuthentication ? $"{apiKeySettings.SchemeName} in Header" : null);
50-
CheckAddSecurityRequirement(operation, hasApiKeyQueryAuthentication ? $"{apiKeySettings.SchemeName} in Query String" : null);
51-
52-
var hasBasicAuthentication = basicAuthenticationSettings.IsConfigured;
53-
CheckAddSecurityRequirement(operation, hasBasicAuthentication ? basicAuthenticationSettings.SchemeName : null);
54-
5544
operation.Responses.TryAdd(StatusCodes.Status401Unauthorized.ToString(), Helpers.CreateResponse(HttpStatusCode.Unauthorized.ToString()));
5645
operation.Responses.TryAdd(StatusCodes.Status403Forbidden.ToString(), Helpers.CreateResponse(HttpStatusCode.Forbidden.ToString()));
5746
}
58-
59-
static void CheckAddSecurityRequirement(OpenApiOperation operation, string? name)
60-
{
61-
if (string.IsNullOrWhiteSpace(name))
62-
{
63-
return;
64-
}
65-
66-
operation.Security.Add(Helpers.CreateSecurityRequirement(name));
67-
}
6847
}
6948
}

0 commit comments

Comments
 (0)