Skip to content

Commit e22ef65

Browse files
committed
Upgrade OpenAPI and Swashbuckle dependencies
Updated project files to upgrade `Swashbuckle.AspNetCore` to v10.0.0 and align with OpenAPI 3.1. Refactored `Program.cs` to use `.WithDescription()` for better readability. Added `net10.0` support in `SimpleAuthentication.Swashbuckle.csproj`. Replaced `Microsoft.OpenApi.Models` with `Microsoft.OpenApi` across multiple files to align with updated libraries. Refactored `SwaggerExtensions.cs` to improve flexibility and maintainability by introducing helper methods and supporting additional security definitions. Upgraded `Nerdbank.GitVersioning` to v3.9.50 and made general improvements to simplify OpenAPI constructs and enhance compatibility with newer library versions.
1 parent a2e7cc0 commit e22ef65

File tree

8 files changed

+50
-60
lines changed

8 files changed

+50
-60
lines changed

samples/MinimalApis/Net8JwtBearerSample/Net8JwtBearerSample.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="[8.0.22,9.0.0)" />
11-
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.6" />
10+
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.22" />
11+
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.0.0" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

samples/MinimalApis/Net8JwtBearerSample/Program.cs

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using JwtBearerSample.Authentication;
33
using Microsoft.AspNetCore.Authentication;
44
using Microsoft.AspNetCore.Http.HttpResults;
5+
using Microsoft.OpenApi;
56
using SimpleAuthentication;
67
using SimpleAuthentication.JwtBearer;
78
using SimpleAuthentication.Permissions;
@@ -57,7 +58,11 @@
5758
app.UseExceptionHandler();
5859
app.UseStatusCodePages();
5960

60-
app.UseSwagger();
61+
app.UseSwagger(options =>
62+
{
63+
options.OpenApiVersion = OpenApiSpecVersion.OpenApi3_1;
64+
});
65+
6166
app.UseSwaggerUI();
6267

6368
app.UseAuthentication();
@@ -79,11 +84,7 @@
7984
var token = await jwtBearerService.CreateTokenAsync(loginRequest.UserName, claims, absoluteExpiration: expiration);
8085
return TypedResults.Ok(new LoginResponse(token));
8186
})
82-
.WithOpenApi(operation =>
83-
{
84-
operation.Description = "Insert permissions in the scope property (for example: 'profile people:admin')";
85-
return operation;
86-
});
87+
.WithDescription("Insert permissions in the scope property (for example: 'profile people:admin')");
8788

8889
authApiGroup.MapPost("validate", async Task<Results<Ok<User>, BadRequest>> (string token, bool validateLifetime, IJwtBearerService jwtBearerService) =>
8990
{
@@ -95,38 +96,28 @@
9596
}
9697

9798
return TypedResults.Ok(new User(result.Principal.Identity!.Name));
98-
})
99-
.WithOpenApi();
99+
});
100100

101101
authApiGroup.MapPost("refresh", async (string token, bool validateLifetime, DateTime? expiration, IJwtBearerService jwtBearerService) =>
102102
{
103103
var newToken = await jwtBearerService.RefreshTokenAsync(token, validateLifetime, expiration);
104104
return TypedResults.Ok(new LoginResponse(newToken));
105-
})
106-
.WithOpenApi();
105+
});
107106

108107
app.MapGet("api/me", (ClaimsPrincipal user) =>
109108
{
110109
return TypedResults.Ok(new User(user.Identity!.Name));
111110
})
112111
.RequireAuthorization()
113112
.RequirePermission("profile")
114-
.WithOpenApi(operation =>
115-
{
116-
operation.Description = "This endpoint requires the 'profile' permission";
117-
return operation;
118-
});
113+
.WithDescription("This endpoint requires the 'profile' permission");
119114

120115
app.MapGet("api/people", () =>
121116
{
122117
return TypedResults.NoContent();
123118
})
124119
.RequireAuthorization(policyNames: "PeopleRead")
125-
.WithOpenApi(operation =>
126-
{
127-
operation.Description = $"This endpoint requires the '{Permissions.PeopleRead}' or '{Permissions.PeopleAdmin}' permissions";
128-
return operation;
129-
});
120+
.WithDescription($"This endpoint requires the '{Permissions.PeopleRead}' or '{Permissions.PeopleAdmin}' permissions");
130121

131122
app.Run();
132123

src/Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="Nerdbank.GitVersioning" Version="3.8.118" PrivateAssets="All" />
12+
<PackageReference Include="Nerdbank.GitVersioning" Version="3.9.50" PrivateAssets="All" />
1313
</ItemGroup>
1414

1515
</Project>

src/SimpleAuthentication.Swashbuckle/SimpleAuthentication.Swashbuckle.csproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
4+
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<LangVersion>latest</LangVersion>
@@ -31,10 +31,6 @@
3131
<FrameworkReference Include="Microsoft.AspNetCore.App" />
3232
</ItemGroup>
3333

34-
<ItemGroup>
35-
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="9.0.6" />
36-
</ItemGroup>
37-
3834
<ItemGroup>
3935
<None Include="..\..\Toolbox.png">
4036
<Pack>True</Pack>
@@ -43,6 +39,10 @@
4339
<None Include="..\..\README.md" Pack="true" PackagePath="\" />
4440
</ItemGroup>
4541

42+
<ItemGroup>
43+
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="10.0.0" />
44+
</ItemGroup>
45+
4646
<ItemGroup>
4747
<ProjectReference Include="..\SimpleAuthentication.Abstractions\SimpleAuthentication.Abstractions.csproj" />
4848
</ItemGroup>

src/SimpleAuthentication.Swashbuckle/Swagger/AuthenticationOperationFilter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using Microsoft.AspNetCore.Authorization;
33
using Microsoft.AspNetCore.Authorization.Infrastructure;
44
using Microsoft.AspNetCore.Http;
5-
using Microsoft.OpenApi.Models;
5+
using Microsoft.OpenApi;
66
using Swashbuckle.AspNetCore.SwaggerGen;
77

88
namespace SimpleAuthentication.Swagger;

src/SimpleAuthentication.Swashbuckle/Swagger/OpenApiHelpers.cs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,15 @@
11
using System.Net.Mime;
22
using Microsoft.AspNetCore.Mvc;
3-
using Microsoft.OpenApi.Models;
3+
using Microsoft.OpenApi;
44

55
namespace SimpleAuthentication.Swagger;
66

77
internal static class OpenApiHelpers
88
{
9-
public static OpenApiSecurityRequirement CreateSecurityRequirement(string name)
9+
public static OpenApiSecurityRequirement CreateSecurityRequirement(string name, OpenApiDocument document)
1010
=> new()
1111
{
12-
{
13-
new()
14-
{
15-
Reference = new()
16-
{
17-
Type = ReferenceType.SecurityScheme,
18-
Id = name
19-
}
20-
},
21-
[]
22-
}
12+
{ new OpenApiSecuritySchemeReference(name, document), [] }
2313
};
2414

2515
public static OpenApiResponse CreateResponse(string description)
@@ -30,7 +20,7 @@ public static OpenApiResponse CreateResponse(string description)
3020
{
3121
[MediaTypeNames.Application.ProblemJson] = new()
3222
{
33-
Schema = new()
23+
Schema = new OpenApiSchemaReference(nameof(ProblemDetails))
3424
{
3525
Reference = new()
3626
{

src/SimpleAuthentication.Swashbuckle/Swagger/ProblemDetailsDocumentFilter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using Microsoft.AspNetCore.Mvc;
2-
using Microsoft.OpenApi.Models;
2+
using Microsoft.OpenApi;
33
using Swashbuckle.AspNetCore.SwaggerGen;
44

55
namespace SimpleAuthentication.Swagger;

src/SimpleAuthentication.Swashbuckle/SwaggerExtensions.cs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using Microsoft.Extensions.Configuration;
33
using Microsoft.Extensions.DependencyInjection;
44
using Microsoft.Net.Http.Headers;
5-
using Microsoft.OpenApi.Models;
5+
using Microsoft.OpenApi;
66
using SimpleAuthentication.ApiKey;
77
using SimpleAuthentication.BasicAuthentication;
88
using SimpleAuthentication.JwtBearer;
@@ -25,7 +25,7 @@ public static class SwaggerExtensions
2525
/// <seealso cref="SwaggerGenOptions"/>
2626
/// <seealso cref="IConfiguration"/>
2727
public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConfiguration configuration, string sectionName = "Authentication")
28-
=> options.AddSimpleAuthentication(configuration, sectionName, Array.Empty<OpenApiSecurityRequirement>());
28+
=> options.AddSimpleAuthentication(configuration, sectionName, [], []);
2929

3030
/// <summary>
3131
/// Adds authentication support in Swagger, enabling the Authorize button in the Swagger UI, reading configuration from a section named <strong>Authentication</strong> in <see cref="IConfiguration"/> source.
@@ -35,7 +35,7 @@ public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConf
3535
/// <param name="additionalSecurityDefinitionNames">The name of additional security definitions that have been defined in Swagger.</param>
3636
/// <seealso cref="SwaggerGenOptions"/>
3737
/// <seealso cref="IConfiguration"/>
38-
public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConfiguration configuration, IEnumerable<string>? additionalSecurityDefinitionNames)
38+
public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConfiguration configuration, params IEnumerable<string> additionalSecurityDefinitionNames)
3939
=> options.AddSimpleAuthentication(configuration, "Authentication", additionalSecurityDefinitionNames);
4040

4141
/// <summary>
@@ -47,11 +47,7 @@ public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConf
4747
/// <param name="additionalSecurityDefinitionNames">The name of additional security definitions that have been defined in Swagger.</param>
4848
/// <seealso cref="SwaggerGenOptions"/>
4949
/// <seealso cref="IConfiguration"/>
50-
public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConfiguration configuration, string sectionName, IEnumerable<string>? additionalSecurityDefinitionNames)
51-
{
52-
var securityRequirements = additionalSecurityDefinitionNames?.Select(OpenApiHelpers.CreateSecurityRequirement).ToArray();
53-
options.AddSimpleAuthentication(configuration, sectionName, securityRequirements ?? []);
54-
}
50+
public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConfiguration configuration, string sectionName, params IEnumerable<string> additionalSecurityDefinitionNames) => options.AddSimpleAuthentication(configuration, sectionName, [], additionalSecurityDefinitionNames);
5551

5652
/// <summary>
5753
/// Adds authentication support in Swagger, enabling the Authorize button in the Swagger UI, reading configuration from the specified <see cref="IConfiguration"/> source.
@@ -61,8 +57,8 @@ public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConf
6157
/// <param name="securityRequirements">Additional security requirements to be added to Swagger definition.</param>
6258
/// <seealso cref="SwaggerGenOptions"/>
6359
/// <seealso cref="IConfiguration"/>
64-
public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConfiguration configuration, params OpenApiSecurityRequirement[] securityRequirements)
65-
=> options.AddSimpleAuthentication(configuration, "Authentication", securityRequirements);
60+
public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConfiguration configuration, params IEnumerable<OpenApiSecurityRequirement> securityRequirements)
61+
=> options.AddSimpleAuthentication(configuration, "Authentication", securityRequirements, []);
6662

6763
/// <summary>
6864
/// Adds authentication support in Swagger, enabling the Authorize button in the Swagger UI, reading configuration from the specified <see cref="IConfiguration"/> source.
@@ -71,9 +67,10 @@ public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConf
7167
/// <param name="configuration">The <see cref="IConfiguration"/> being bound.</param>
7268
/// <param name="sectionName">The name of the configuration section that holds authentication settings (default: Authentication).</param>
7369
/// <param name="additionalSecurityRequirements">Additional security requirements to be added to Swagger definition.</param>
70+
/// <param name="additionalSecurityDefinitionNames">The name of additional security definitions that have been defined in OpenAPI.</param>
7471
/// <seealso cref="SwaggerGenOptions"/>
7572
/// <seealso cref="IConfiguration"/>
76-
public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConfiguration configuration, string sectionName, params OpenApiSecurityRequirement[] additionalSecurityRequirements)
73+
public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConfiguration configuration, string sectionName, IEnumerable<OpenApiSecurityRequirement> additionalSecurityRequirements, IEnumerable<string> additionalSecurityDefinitionNames)
7774
{
7875
ArgumentNullException.ThrowIfNull(options);
7976
ArgumentNullException.ThrowIfNull(configuration);
@@ -84,12 +81,21 @@ public static void AddSimpleAuthentication(this SwaggerGenOptions options, IConf
8481
CheckAddApiKey(options, configuration.GetSection($"{sectionName}:ApiKey"));
8582
CheckAddBasicAuthentication(options, configuration.GetSection($"{sectionName}:Basic"));
8683

87-
if (additionalSecurityRequirements?.Any() ?? false)
84+
if (additionalSecurityRequirements?.Any() == true)
8885
{
8986
// Adds all the other security requirements that have been specified.
9087
foreach (var securityRequirement in additionalSecurityRequirements)
9188
{
92-
options.AddSecurityRequirement(securityRequirement);
89+
AddSecurityRequirement(options, securityRequirement);
90+
}
91+
}
92+
93+
if (additionalSecurityDefinitionNames?.Any() == true)
94+
{
95+
// Adds all the other security definitions that have been specified.
96+
foreach (var definitionName in additionalSecurityDefinitionNames)
97+
{
98+
AddSecurityRequirement(options, definitionName);
9399
}
94100
}
95101

@@ -146,7 +152,7 @@ static void CheckAddBasicAuthentication(SwaggerGenOptions options, IConfiguratio
146152
}
147153

148154
static void AddSecurityDefinition(SwaggerGenOptions options, string name, SecuritySchemeType securitySchemeType, string? scheme, ParameterLocation location, string parameterName, string description)
149-
=> options.AddSecurityDefinition(name, new()
155+
=> options.AddSecurityDefinition(name, new OpenApiSecurityScheme()
150156
{
151157
In = location,
152158
Name = parameterName,
@@ -195,7 +201,7 @@ public static void AddOAuth2Authentication(this SwaggerGenOptions options, strin
195201
ArgumentException.ThrowIfNullOrWhiteSpace(name);
196202
ArgumentNullException.ThrowIfNull(authFlow);
197203

198-
options.AddSecurityDefinition(name, new()
204+
options.AddSecurityDefinition(name, new OpenApiSecurityScheme()
199205
{
200206
Type = SecuritySchemeType.OAuth2,
201207
Flows = new()
@@ -207,6 +213,9 @@ public static void AddOAuth2Authentication(this SwaggerGenOptions options, strin
207213
AddSecurityRequirement(options, name);
208214
}
209215

216+
private static void AddSecurityRequirement(SwaggerGenOptions options, OpenApiSecurityRequirement requirement)
217+
=> options.AddSecurityRequirement(_ => requirement);
218+
210219
private static void AddSecurityRequirement(SwaggerGenOptions options, string name)
211-
=> options.AddSecurityRequirement(OpenApiHelpers.CreateSecurityRequirement(name));
220+
=> options.AddSecurityRequirement(document => OpenApiHelpers.CreateSecurityRequirement(name, document));
212221
}

0 commit comments

Comments
 (0)