Merge branch 'release/2.2'
This commit is contained in:
commit
a2e5e8755f
|
|
@ -71,6 +71,8 @@
|
||||||
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview1-26907-04</SystemRuntimeCompilerServicesUnsafePackageVersion>
|
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview1-26907-04</SystemRuntimeCompilerServicesUnsafePackageVersion>
|
||||||
<SystemThreadingChannelsPackageVersion>4.6.0-preview1-26907-04</SystemThreadingChannelsPackageVersion>
|
<SystemThreadingChannelsPackageVersion>4.6.0-preview1-26907-04</SystemThreadingChannelsPackageVersion>
|
||||||
<SystemThreadingTasksExtensionsPackageVersion>4.6.0-preview1-26907-04</SystemThreadingTasksExtensionsPackageVersion>
|
<SystemThreadingTasksExtensionsPackageVersion>4.6.0-preview1-26907-04</SystemThreadingTasksExtensionsPackageVersion>
|
||||||
|
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.5.1</SystemRuntimeCompilerServicesUnsafePackageVersion>
|
||||||
|
<SystemSecurityPrincipalWindowsPackageVersion>4.5.0</SystemSecurityPrincipalWindowsPackageVersion>
|
||||||
<XunitAssertPackageVersion>2.3.1</XunitAssertPackageVersion>
|
<XunitAssertPackageVersion>2.3.1</XunitAssertPackageVersion>
|
||||||
<XunitExtensibilityCorePackageVersion>2.3.1</XunitExtensibilityCorePackageVersion>
|
<XunitExtensibilityCorePackageVersion>2.3.1</XunitExtensibilityCorePackageVersion>
|
||||||
<XunitPackageVersion>2.3.1</XunitPackageVersion>
|
<XunitPackageVersion>2.3.1</XunitPackageVersion>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
package com.microsoft.aspnet.signalr;
|
package com.microsoft.aspnet.signalr;
|
||||||
|
|
||||||
public enum HubMessageType {
|
enum HubMessageType {
|
||||||
INVOCATION(1),
|
INVOCATION(1),
|
||||||
STREAM_ITEM(2),
|
STREAM_ITEM(2),
|
||||||
COMPLETION(3),
|
COMPLETION(3),
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
public class HandshakeProtocolTest {
|
class HandshakeProtocolTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void VerifyCreateHandshakerequestMessage() {
|
public void VerifyCreateHandshakerequestMessage() {
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
|
||||||
public class HubConnectionTest {
|
class HubConnectionTest {
|
||||||
private static final String RECORD_SEPARATOR = "\u001e";
|
private static final String RECORD_SEPARATOR = "\u001e";
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
public class HubExceptionTest {
|
class HubExceptionTest {
|
||||||
@Test
|
@Test
|
||||||
public void VeryHubExceptionMesssageIsSet() {
|
public void VeryHubExceptionMesssageIsSet() {
|
||||||
String errorMessage = "This is a HubException";
|
String errorMessage = "This is a HubException";
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import java.util.List;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
|
||||||
public class JsonHubProtocolTest {
|
class JsonHubProtocolTest {
|
||||||
private JsonHubProtocol jsonHubProtocol = new JsonHubProtocol();
|
private JsonHubProtocol jsonHubProtocol = new JsonHubProtocol();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import static org.junit.jupiter.api.Assertions.*;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
|
||||||
public class NegotiateResponseTest {
|
class NegotiateResponseTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void VerifyNegotiateResponse() {
|
public void VerifyNegotiateResponse() {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import org.junit.jupiter.params.ParameterizedTest;
|
||||||
import org.junit.jupiter.params.provider.Arguments;
|
import org.junit.jupiter.params.provider.Arguments;
|
||||||
import org.junit.jupiter.params.provider.MethodSource;
|
import org.junit.jupiter.params.provider.MethodSource;
|
||||||
|
|
||||||
public class ResolveNegotiateUrlTest {
|
class ResolveNegotiateUrlTest {
|
||||||
private static Stream<Arguments> protocols() {
|
private static Stream<Arguments> protocols() {
|
||||||
return Stream.of(
|
return Stream.of(
|
||||||
Arguments.of("http://example.com/hub/", "http://example.com/hub/negotiate"),
|
Arguments.of("http://example.com/hub/", "http://example.com/hub/negotiate"),
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
public class WebSocketTransportTest {
|
class WebSocketTransportTest {
|
||||||
@Test
|
@Test
|
||||||
public void WebsocketThrowsIfItCantConnect() throws Exception {
|
public void WebsocketThrowsIfItCantConnect() throws Exception {
|
||||||
Transport transport = new WebSocketTransport("www.notarealurl12345.fake", new NullLogger());
|
Transport transport = new WebSocketTransport("www.notarealurl12345.fake", new NullLogger());
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import org.junit.jupiter.params.ParameterizedTest;
|
||||||
import org.junit.jupiter.params.provider.Arguments;
|
import org.junit.jupiter.params.provider.Arguments;
|
||||||
import org.junit.jupiter.params.provider.MethodSource;
|
import org.junit.jupiter.params.provider.MethodSource;
|
||||||
|
|
||||||
public class WebSocketTransportUrlFormatTest {
|
class WebSocketTransportUrlFormatTest {
|
||||||
private static Stream<Arguments> protocols() {
|
private static Stream<Arguments> protocols() {
|
||||||
return Stream.of(
|
return Stream.of(
|
||||||
Arguments.of("http://example.com", "ws://example.com"),
|
Arguments.of("http://example.com", "ws://example.com"),
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
|
using System.Security.Principal;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Connections;
|
using Microsoft.AspNetCore.Connections;
|
||||||
|
|
@ -208,6 +209,14 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
|
||||||
Cancellation?.Dispose();
|
Cancellation?.Dispose();
|
||||||
|
|
||||||
Cancellation = null;
|
Cancellation = null;
|
||||||
|
|
||||||
|
if (User != null && User.Identity is WindowsIdentity)
|
||||||
|
{
|
||||||
|
foreach (var identity in User.Identities)
|
||||||
|
{
|
||||||
|
(identity as IDisposable)?.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await disposeTask;
|
await disposeTask;
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,11 @@ using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
|
using System.Security.Claims;
|
||||||
|
using System.Security.Principal;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Connections;
|
using Microsoft.AspNetCore.Connections;
|
||||||
using Microsoft.AspNetCore.Connections.Features;
|
|
||||||
using Microsoft.AspNetCore.Http.Connections.Features;
|
|
||||||
using Microsoft.AspNetCore.Http.Connections.Internal.Transports;
|
using Microsoft.AspNetCore.Http.Connections.Internal.Transports;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
using Microsoft.AspNetCore.Http.Features;
|
||||||
using Microsoft.AspNetCore.Internal;
|
using Microsoft.AspNetCore.Internal;
|
||||||
|
|
@ -608,9 +608,6 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup the connection state from the http context
|
|
||||||
connection.User = context.User;
|
|
||||||
|
|
||||||
// Configure transport-specific features.
|
// Configure transport-specific features.
|
||||||
if (transportType == HttpTransportType.LongPolling)
|
if (transportType == HttpTransportType.LongPolling)
|
||||||
{
|
{
|
||||||
|
|
@ -630,7 +627,15 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
|
||||||
{
|
{
|
||||||
// Set the request trace identifier to the current http request handling the poll
|
// Set the request trace identifier to the current http request handling the poll
|
||||||
existing.TraceIdentifier = context.TraceIdentifier;
|
existing.TraceIdentifier = context.TraceIdentifier;
|
||||||
existing.User = context.User;
|
|
||||||
|
// Don't copy the identity if it's a windows identity
|
||||||
|
// We specifically clone the identity on first poll if it's a windows identity
|
||||||
|
// If we swapped the new User here we'd have to dispose the old identities which could race with the application
|
||||||
|
// trying to access the identity.
|
||||||
|
if (context.User.Identity is WindowsIdentity)
|
||||||
|
{
|
||||||
|
existing.User = context.User;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -638,6 +643,9 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
|
||||||
connection.HttpContext = context;
|
connection.HttpContext = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setup the connection state from the http context
|
||||||
|
connection.User = connection.HttpContext.User;
|
||||||
|
|
||||||
// Set the Connection ID on the logging scope so that logs from now on will have the
|
// Set the Connection ID on the logging scope so that logs from now on will have the
|
||||||
// Connection ID metadata set.
|
// Connection ID metadata set.
|
||||||
logScope.ConnectionId = connection.ConnectionId;
|
logScope.ConnectionId = connection.ConnectionId;
|
||||||
|
|
@ -645,6 +653,23 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void CloneUser(HttpContext newContext, HttpContext oldContext)
|
||||||
|
{
|
||||||
|
if (oldContext.User.Identity is WindowsIdentity)
|
||||||
|
{
|
||||||
|
newContext.User = new ClaimsPrincipal();
|
||||||
|
|
||||||
|
foreach (var identity in oldContext.User.Identities)
|
||||||
|
{
|
||||||
|
newContext.User.AddIdentity(identity.Clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newContext.User = oldContext.User;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static HttpContext CloneHttpContext(HttpContext context)
|
private static HttpContext CloneHttpContext(HttpContext context)
|
||||||
{
|
{
|
||||||
// The reason we're copying the base features instead of the HttpContext properties is
|
// The reason we're copying the base features instead of the HttpContext properties is
|
||||||
|
|
@ -692,7 +717,8 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
|
||||||
|
|
||||||
var newHttpContext = new DefaultHttpContext(features);
|
var newHttpContext = new DefaultHttpContext(features);
|
||||||
newHttpContext.TraceIdentifier = context.TraceIdentifier;
|
newHttpContext.TraceIdentifier = context.TraceIdentifier;
|
||||||
newHttpContext.User = context.User;
|
|
||||||
|
CloneUser(newHttpContext, context);
|
||||||
|
|
||||||
// Making request services function property could be tricky and expensive as it would require
|
// Making request services function property could be tricky and expensive as it would require
|
||||||
// DI scope per connection. It would also mean that services resolved in middleware leading up to here
|
// DI scope per connection. It would also mean that services resolved in middleware leading up to here
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
<PackageReference Include="Microsoft.Extensions.WebEncoders.Sources" Version="$(MicrosoftExtensionsWebEncodersSourcesPackageVersion)" PrivateAssets="All" />
|
<PackageReference Include="Microsoft.Extensions.WebEncoders.Sources" Version="$(MicrosoftExtensionsWebEncodersSourcesPackageVersion)" PrivateAssets="All" />
|
||||||
<PackageReference Include="Microsoft.Extensions.ValueStopwatch.Sources" Version="$(MicrosoftExtensionsValueStopwatchSourcesPackageVersion)" PrivateAssets="All" />
|
<PackageReference Include="Microsoft.Extensions.ValueStopwatch.Sources" Version="$(MicrosoftExtensionsValueStopwatchSourcesPackageVersion)" PrivateAssets="All" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonPackageVersion)" />
|
<PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonPackageVersion)" />
|
||||||
|
<PackageReference Include="System.Security.Principal.Windows" Version="$(SystemSecurityPrincipalWindowsPackageVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue