Flow the ConnectionContext to the SNI callback (#2478)
This commit is contained in:
parent
e8bb88cb58
commit
f6b2880369
|
|
@ -2,6 +2,7 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using Microsoft.AspNetCore.Connections;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
using Microsoft.AspNetCore.Http.Features;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal
|
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal
|
||||||
|
|
@ -10,13 +11,15 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal
|
||||||
// we want to add more connection metadata later.
|
// we want to add more connection metadata later.
|
||||||
public class ConnectionAdapterContext
|
public class ConnectionAdapterContext
|
||||||
{
|
{
|
||||||
internal ConnectionAdapterContext(IFeatureCollection features, Stream connectionStream)
|
internal ConnectionAdapterContext(ConnectionContext connectionContext, Stream connectionStream)
|
||||||
{
|
{
|
||||||
Features = features;
|
ConnectionContext = connectionContext;
|
||||||
ConnectionStream = connectionStream;
|
ConnectionStream = connectionStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IFeatureCollection Features { get; }
|
internal ConnectionContext ConnectionContext { get; }
|
||||||
|
|
||||||
|
public IFeatureCollection Features => ConnectionContext.Features;
|
||||||
|
|
||||||
public Stream ConnectionStream { get; }
|
public Stream ConnectionStream { get; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ using System.Net.Security;
|
||||||
using System.Security.Authentication;
|
using System.Security.Authentication;
|
||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
using Microsoft.AspNetCore.Connections;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Server.Kestrel.Https
|
namespace Microsoft.AspNetCore.Server.Kestrel.Https
|
||||||
|
|
@ -47,7 +47,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Https
|
||||||
/// If the server certificate has an Extended Key Usage extension, the usages must include Server Authentication (OID 1.3.6.1.5.5.7.3.1).
|
/// If the server certificate has an Extended Key Usage extension, the usages must include Server Authentication (OID 1.3.6.1.5.5.7.3.1).
|
||||||
/// </para>
|
/// </para>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Func<IFeatureCollection, string, X509Certificate2> ServerCertificateSelector { get; set; }
|
public Func<ConnectionContext, string, X509Certificate2> ServerCertificateSelector { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Specifies the client certificate requirements for a HTTPS connection. Defaults to <see cref="ClientCertificateMode.NoCertificate"/>.
|
/// Specifies the client certificate requirements for a HTTPS connection. Defaults to <see cref="ClientCertificateMode.NoCertificate"/>.
|
||||||
|
|
|
||||||
|
|
@ -300,7 +300,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal
|
||||||
{
|
{
|
||||||
var connectionAdapters = _context.ConnectionAdapters;
|
var connectionAdapters = _context.ConnectionAdapters;
|
||||||
var stream = new RawStream(_context.Transport.Input, _context.Transport.Output);
|
var stream = new RawStream(_context.Transport.Input, _context.Transport.Output);
|
||||||
var adapterContext = new ConnectionAdapterContext(_context.ConnectionFeatures, stream);
|
var adapterContext = new ConnectionAdapterContext(_context.ConnectionContext, stream);
|
||||||
_adaptedConnections = new List<IAdaptedConnection>(connectionAdapters.Count);
|
_adaptedConnections = new List<IAdaptedConnection>(connectionAdapters.Count);
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|
@ -309,7 +309,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal
|
||||||
{
|
{
|
||||||
var adaptedConnection = await connectionAdapters[i].OnConnectionAsync(adapterContext);
|
var adaptedConnection = await connectionAdapters[i].OnConnectionAsync(adapterContext);
|
||||||
_adaptedConnections.Add(adaptedConnection);
|
_adaptedConnections.Add(adaptedConnection);
|
||||||
adapterContext = new ConnectionAdapterContext(_context.ConnectionFeatures, adaptedConnection.ConnectionStream);
|
adapterContext = new ConnectionAdapterContext(_context.ConnectionContext, adaptedConnection.ConnectionStream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ using System.Buffers;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
using Microsoft.AspNetCore.Connections;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
using Microsoft.AspNetCore.Http.Features;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal;
|
using Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal;
|
||||||
|
|
||||||
|
|
@ -15,6 +16,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal
|
||||||
public string ConnectionId { get; set; }
|
public string ConnectionId { get; set; }
|
||||||
public long HttpConnectionId { get; set; }
|
public long HttpConnectionId { get; set; }
|
||||||
public HttpProtocols Protocols { get; set; }
|
public HttpProtocols Protocols { get; set; }
|
||||||
|
public ConnectionContext ConnectionContext { get; set; }
|
||||||
public ServiceContext ServiceContext { get; set; }
|
public ServiceContext ServiceContext { get; set; }
|
||||||
public IFeatureCollection ConnectionFeatures { get; set; }
|
public IFeatureCollection ConnectionFeatures { get; set; }
|
||||||
public IList<IConnectionAdapter> ConnectionAdapters { get; set; }
|
public IList<IConnectionAdapter> ConnectionAdapters { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal
|
||||||
var httpConnectionContext = new HttpConnectionContext
|
var httpConnectionContext = new HttpConnectionContext
|
||||||
{
|
{
|
||||||
ConnectionId = connectionContext.ConnectionId,
|
ConnectionId = connectionContext.ConnectionId,
|
||||||
|
ConnectionContext = connectionContext,
|
||||||
HttpConnectionId = httpConnectionId,
|
HttpConnectionId = httpConnectionId,
|
||||||
Protocols = _protocols,
|
Protocols = _protocols,
|
||||||
ServiceContext = _serviceContext,
|
ServiceContext = _serviceContext,
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ using System.Net.Security;
|
||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Connections;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
using Microsoft.AspNetCore.Http.Features;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal;
|
using Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal;
|
||||||
|
|
@ -22,7 +23,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Https.Internal
|
||||||
|
|
||||||
private readonly HttpsConnectionAdapterOptions _options;
|
private readonly HttpsConnectionAdapterOptions _options;
|
||||||
private readonly X509Certificate2 _serverCertificate;
|
private readonly X509Certificate2 _serverCertificate;
|
||||||
private readonly Func<IFeatureCollection, string, X509Certificate2> _serverCertificateSelector;
|
private readonly Func<ConnectionContext, string, X509Certificate2> _serverCertificateSelector;
|
||||||
|
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
|
@ -133,7 +134,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Https.Internal
|
||||||
selector = (sender, name) =>
|
selector = (sender, name) =>
|
||||||
{
|
{
|
||||||
context.Features.Set(sslStream);
|
context.Features.Set(sslStream);
|
||||||
var cert = _serverCertificateSelector(context.Features, name);
|
var cert = _serverCertificateSelector(context.ConnectionContext, name);
|
||||||
if (cert != null)
|
if (cert != null)
|
||||||
{
|
{
|
||||||
EnsureCertificateIsAllowedForServerAuth(cert);
|
EnsureCertificateIsAllowedForServerAuth(cert);
|
||||||
|
|
@ -169,7 +170,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Https.Internal
|
||||||
if (_serverCertificateSelector != null)
|
if (_serverCertificateSelector != null)
|
||||||
{
|
{
|
||||||
context.Features.Set(sslStream);
|
context.Features.Set(sslStream);
|
||||||
serverCert = _serverCertificateSelector(context.Features, null);
|
serverCert = _serverCertificateSelector(context.ConnectionContext, null);
|
||||||
if (serverCert != null)
|
if (serverCert != null)
|
||||||
{
|
{
|
||||||
EnsureCertificateIsAllowedForServerAuth(serverCert);
|
EnsureCertificateIsAllowedForServerAuth(serverCert);
|
||||||
|
|
|
||||||
|
|
@ -160,10 +160,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
|
||||||
{
|
{
|
||||||
new HttpsConnectionAdapter(new HttpsConnectionAdapterOptions
|
new HttpsConnectionAdapter(new HttpsConnectionAdapterOptions
|
||||||
{
|
{
|
||||||
ServerCertificateSelector = (features, name) =>
|
ServerCertificateSelector = (connection, name) =>
|
||||||
{
|
{
|
||||||
Assert.NotNull(features);
|
Assert.NotNull(connection);
|
||||||
Assert.NotNull(features.Get<SslStream>());
|
Assert.NotNull(connection.Features.Get<SslStream>());
|
||||||
#if NETCOREAPP2_1
|
#if NETCOREAPP2_1
|
||||||
Assert.Equal("localhost", name);
|
Assert.Equal("localhost", name);
|
||||||
#else
|
#else
|
||||||
|
|
@ -201,10 +201,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
|
||||||
{
|
{
|
||||||
new HttpsConnectionAdapter(new HttpsConnectionAdapterOptions
|
new HttpsConnectionAdapter(new HttpsConnectionAdapterOptions
|
||||||
{
|
{
|
||||||
ServerCertificateSelector = (features, name) =>
|
ServerCertificateSelector = (connection, name) =>
|
||||||
{
|
{
|
||||||
Assert.NotNull(features);
|
Assert.NotNull(connection);
|
||||||
Assert.NotNull(features.Get<SslStream>());
|
Assert.NotNull(connection.Features.Get<SslStream>());
|
||||||
#if NETCOREAPP2_1
|
#if NETCOREAPP2_1
|
||||||
Assert.Equal("localhost", name);
|
Assert.Equal("localhost", name);
|
||||||
#else
|
#else
|
||||||
|
|
@ -291,10 +291,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
|
||||||
new HttpsConnectionAdapter(new HttpsConnectionAdapterOptions
|
new HttpsConnectionAdapter(new HttpsConnectionAdapterOptions
|
||||||
{
|
{
|
||||||
ServerCertificate = _x509Certificate2NoExt,
|
ServerCertificate = _x509Certificate2NoExt,
|
||||||
ServerCertificateSelector = (features, name) =>
|
ServerCertificateSelector = (connection, name) =>
|
||||||
{
|
{
|
||||||
Assert.NotNull(features);
|
Assert.NotNull(connection);
|
||||||
Assert.NotNull(features.Get<SslStream>());
|
Assert.NotNull(connection.Features.Get<SslStream>());
|
||||||
#if NETCOREAPP2_1
|
#if NETCOREAPP2_1
|
||||||
Assert.Equal("localhost", name);
|
Assert.Equal("localhost", name);
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue