Skip to content

Commit f9cf5b8

Browse files
mdaneribaywet
authored andcommitted
Support mutualTLS security scheme type (#2696)
feat(models): support mutualTLS security scheme * fix(writers): throw for mutualTLS in OAS 3.0
1 parent 7bda14f commit f9cf5b8

File tree

5 files changed

+45
-1
lines changed

5 files changed

+45
-1
lines changed

src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
115115
// openIdConnectUrl
116116
writer.WriteProperty(OpenApiConstants.OpenIdConnectUrl, OpenIdConnectUrl?.ToString());
117117
break;
118+
case SecuritySchemeType.MutualTLS:
119+
// No additional properties for mutualTLS
120+
if (version < OpenApiSpecVersion.OpenApi3_1)
121+
{
122+
// mutualTLS is introduced in OpenAPI 3.1
123+
throw new OpenApiException($"mutualTLS security scheme is only supported in OpenAPI 3.1 and later versions. Current version: {version}");
124+
}
125+
break;
118126
}
119127

120128
// extensions
@@ -146,6 +154,14 @@ public virtual void SerializeAsV2(IOpenApiWriter writer)
146154
return;
147155
}
148156

157+
if (Type == SecuritySchemeType.MutualTLS)
158+
{
159+
// Bail because V2 does not support mutualTLS
160+
writer.WriteStartObject();
161+
writer.WriteEndObject();
162+
return;
163+
}
164+
149165
writer.WriteStartObject();
150166

151167
// type

src/Microsoft.OpenApi/Models/SecuritySchemeType.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public enum SecuritySchemeType
2626
/// <summary>
2727
/// Use OAuth2 with OpenId Connect URL to discover OAuth2 configuration value.
2828
/// </summary>
29-
[Display("openIdConnect")] OpenIdConnect
29+
[Display("openIdConnect")] OpenIdConnect,
30+
31+
/// <summary>
32+
/// Use mutual TLS authentication.
33+
/// </summary>
34+
[Display("mutualTLS")] MutualTLS
3035
}
3136
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
type: mutualTLS
2+
description: Sample Description

test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ public class OpenApiSecuritySchemeTests
100100
OpenIdConnectUrl = new("https://example.com/openIdConnect")
101101
};
102102

103+
private static OpenApiSecurityScheme MutualTlsSecurityScheme => new()
104+
{
105+
Description = "description1",
106+
Type = SecuritySchemeType.MutualTLS
107+
};
108+
103109
private static OpenApiSecuritySchemeReference OpenApiSecuritySchemeReference => new("sampleSecurityScheme");
104110
private static OpenApiSecurityScheme ReferencedSecurityScheme => new()
105111
{
@@ -198,6 +204,19 @@ public async Task SerializeHttpBearerSecuritySchemeAsV3JsonWorks()
198204
Assert.Equal(expected, actual);
199205
}
200206

207+
[Fact]
208+
public void SerializeMutualTlsSecuritySchemeAsV3Throws()
209+
{
210+
// Arrange
211+
var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture);
212+
var writer = new OpenApiJsonWriter(outputStringWriter);
213+
214+
// Act & Assert
215+
var exception = Assert.Throws<OpenApiException>(() => MutualTlsSecurityScheme.SerializeAsV3(writer));
216+
Assert.Contains("mutualTLS security scheme is only supported in OpenAPI 3.1 and later versions", exception.Message);
217+
Assert.Contains($"Current version: {OpenApiSpecVersion.OpenApi3_0}", exception.Message);
218+
}
219+
201220
[Fact]
202221
public async Task SerializeOAuthSingleFlowSecuritySchemeAsV3JsonWorks()
203222
{

test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,6 +1808,8 @@ namespace Microsoft.OpenApi
18081808
OAuth2 = 2,
18091809
[Microsoft.OpenApi.Display("openIdConnect")]
18101810
OpenIdConnect = 3,
1811+
[Microsoft.OpenApi.Display("mutualTLS")]
1812+
MutualTLS = 4,
18111813
}
18121814
public abstract class SourceExpression : Microsoft.OpenApi.RuntimeExpression
18131815
{

0 commit comments

Comments
 (0)