Skip to content

Commit 80b7dc7

Browse files
committed
Load ClientCertificateMode from config
1 parent 7132792 commit 80b7dc7

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

src/Servers/Kestrel/Core/src/Internal/ConfigurationReader.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.Linq;
77
using System.Security.Authentication;
8+
using Microsoft.AspNetCore.Server.Kestrel.Https;
89
using Microsoft.Extensions.Configuration;
910

1011
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal
@@ -18,12 +19,14 @@ internal class ConfigurationReader
1819
private const string EndpointDefaultsKey = "EndpointDefaults";
1920
private const string EndpointsKey = "Endpoints";
2021
private const string UrlKey = "Url";
22+
private const string ClientCertificateModeKey = "ClientCertificateMode";
2123

2224
private readonly IConfiguration _configuration;
2325

2426
private IDictionary<string, CertificateConfig> _certificates;
2527
private EndpointDefaults _endpointDefaults;
2628
private IEnumerable<EndpointConfig> _endpoints;
29+
private ClientCertificateMode? _clientCertificateMode;
2730

2831
public ConfigurationReader(IConfiguration configuration)
2932
{
@@ -33,6 +36,7 @@ public ConfigurationReader(IConfiguration configuration)
3336
public IDictionary<string, CertificateConfig> Certificates => _certificates ??= ReadCertificates();
3437
public EndpointDefaults EndpointDefaults => _endpointDefaults ??= ReadEndpointDefaults();
3538
public IEnumerable<EndpointConfig> Endpoints => _endpoints ??= ReadEndpoints();
39+
public ClientCertificateMode? ClientCertificateMode => _clientCertificateMode ??= ReadClientCertificateMode();
3640

3741
private IDictionary<string, CertificateConfig> ReadCertificates()
3842
{
@@ -100,6 +104,16 @@ private IEnumerable<EndpointConfig> ReadEndpoints()
100104
return endpoints;
101105
}
102106

107+
private ClientCertificateMode? ReadClientCertificateMode()
108+
{
109+
if (Enum.TryParse<ClientCertificateMode>(_configuration[ClientCertificateModeKey], ignoreCase: true, out var result))
110+
{
111+
return result;
112+
}
113+
114+
return null;
115+
}
116+
103117
private static HttpProtocols? ParseProtocols(string protocols)
104118
{
105119
if (Enum.TryParse<HttpProtocols>(protocols, ignoreCase: true, out var result))

src/Servers/Kestrel/Core/src/KestrelConfigurationLoader.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,8 @@ public void Load()
293293
httpsOptions.ServerCertificate = LoadCertificate(endpoint.Certificate, endpoint.Name)
294294
?? httpsOptions.ServerCertificate;
295295

296+
httpsOptions.ClientCertificateMode = ConfigurationReader.ClientCertificateMode ?? httpsOptions.ClientCertificateMode;
297+
296298
if (httpsOptions.ServerCertificate == null && httpsOptions.ServerCertificateSelector == null)
297299
{
298300
// Fallback

src/Servers/Kestrel/Kestrel/test/ConfigurationReaderTests.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,46 @@
77
using System.Security.Authentication;
88
using Microsoft.AspNetCore.Server.Kestrel.Core;
99
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
10+
using Microsoft.AspNetCore.Server.Kestrel.Https;
1011
using Microsoft.Extensions.Configuration;
1112
using Xunit;
1213

1314
namespace Microsoft.AspNetCore.Server.Kestrel.Tests
1415
{
1516
public class ConfigurationReaderTests
1617
{
18+
[Fact]
19+
public void ReadClientCertificateMode_ReturnsValue()
20+
{
21+
// Arrange
22+
var config = new ConfigurationBuilder()
23+
.AddInMemoryCollection(new Dictionary<string, string>
24+
{
25+
["ClientCertificateMode"] = "AllowCertificate"
26+
})
27+
.Build();
28+
29+
// Act
30+
var reader = new ConfigurationReader(config);
31+
32+
// Assert
33+
Assert.NotNull(reader.ClientCertificateMode);
34+
Assert.Equal(ClientCertificateMode.AllowCertificate, reader.ClientCertificateMode);
35+
}
36+
37+
[Fact]
38+
public void ReadClientCertificateModeWhenNoClientCertificateMode_ReturnsNull()
39+
{
40+
// Arrange
41+
var config = new ConfigurationBuilder().AddInMemoryCollection().Build();
42+
43+
// Act
44+
var reader = new ConfigurationReader(config);
45+
46+
// Assert
47+
Assert.Null(reader.ClientCertificateMode);
48+
}
49+
1750
[Fact]
1851
public void ReadCertificatesWhenNoCertificatesSection_ReturnsEmptyCollection()
1952
{

0 commit comments

Comments
 (0)