Skip to content

Commit 60194b0

Browse files
committedMay 17, 2018
fixes https bindings
1 parent b4afcf1 commit 60194b0

File tree

9 files changed

+97
-37
lines changed

9 files changed

+97
-37
lines changed
 

‎Samples/Simple/Properties/launchSettings.json

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,26 @@
44
"anonymousAuthentication": true,
55
"iisExpress": {
66
"applicationUrl": "http://localhost:61276/",
7-
"sslPort": 0
7+
"sslPort": 44395
88
}
99
},
1010
"profiles": {
1111
"IIS Express": {
1212
"commandName": "IISExpress",
1313
"launchBrowser": true,
14-
"launchUrl": "api/values",
14+
"launchUrl": "wcf/echo",
1515
"environmentVariables": {
1616
"ASPNETCORE_ENVIRONMENT": "Development"
1717
}
1818
},
1919
"Simple": {
20-
"commandName": "Project",
20+
"commandName": "IISExpress",
2121
"launchBrowser": true,
22-
"launchUrl": "api/values",
22+
"launchUrl": "wcf/echo",
2323
"environmentVariables": {
2424
"ASPNETCORE_ENVIRONMENT": "Development"
2525
},
2626
"applicationUrl": "http://localhost:61277/"
2727
}
2828
}
29-
}
29+
}

‎Samples/Simple/Startup.cs

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.IdentityModel.Tokens;
34
using System.Linq;
45
using System.Net.Security;
56
using System.ServiceModel;
@@ -31,8 +32,19 @@ public void ConfigureServices(IServiceCollection services)
3132
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
3233
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
3334
{
34-
app.UseWcfService<EchoWcfService, IEchoContract>("/wcf/echo");
35+
app.UseWcfService<EchoWcfService>("/wcf/echo", builder =>
36+
{
37+
builder.AddServiceEndpoint<IEchoContract>(CreateBinding());
38+
});
3539
app.UseMvc();
3640
}
41+
42+
private Binding CreateBinding()
43+
{
44+
var binding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential);
45+
binding.Security.Message.EstablishSecurityContext = false;
46+
return binding;
47+
}
48+
3749
}
3850
}

‎Solid.AspNetCore.Extensions.Wcf.Tests/BehaviorTestFixture.cs

+8-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Linq;
7+
using System.Net;
78
using System.ServiceModel;
9+
using System.ServiceModel.Channels;
810
using System.Text;
911
using System.Threading.Tasks;
1012

@@ -13,11 +15,14 @@ namespace Solid.AspNetCore.Extensions.Wcf.Tests
1315
public class BehaviorTestFixture : IDisposable
1416
{
1517
private IInstanceTestService _singleton;
16-
18+
static BehaviorTestFixture()
19+
{
20+
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
21+
}
1722
public BehaviorTestFixture()
1823
{
1924
TestingServer = new TestingServerBuilder()
20-
.AddAspNetCoreHostFactory()
25+
.AddAspNetCoreHostFactory(Scheme.Https)
2126
.AddStartup<BehaviorTestStartup>()
2227
.Build();
2328
}
@@ -29,7 +34,7 @@ public IInstanceTestService GetService(string username, string password)
2934
if (_singleton == null)
3035
{
3136
var url = new Uri(TestingServer.BaseAddress, "singleton");
32-
var binding = new WS2007HttpBinding(SecurityMode.Message);
37+
var binding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential);
3338
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
3439
binding.Security.Message.EstablishSecurityContext = false;
3540
var endpoint = new EndpointAddress(url);

‎Solid.AspNetCore.Extensions.Wcf.Tests/Host/BehaviorTestStartup.cs

+9-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ static BehaviorTestStartup()
3030

3131
public void ConfigureServices(IServiceCollection services)
3232
{
33-
var binding = new WS2007HttpBinding(SecurityMode.Message);
33+
var binding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential);
3434
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
3535
binding.Security.Message.EstablishSecurityContext = false;
3636
services.AddLogging(builder =>
@@ -42,7 +42,14 @@ public void ConfigureServices(IServiceCollection services)
4242
services.AddSingleton<UserNamePasswordValidator>(MockUserNamePasswordValidator.Object);
4343
services.AddSingleton<IServiceBehavior, UserNamePasswordValidatorBehavior>();
4444
services.AddSingleton<IServiceBehavior, OutputBehavior>();
45-
services.AddWcfServiceWithMetadata<SingletonService>().AddDefaultBinding(binding);
45+
services
46+
.AddWcfService<SingletonService>(wcf =>
47+
wcf.WithServiceMetadataBehavior(behavior =>
48+
{
49+
behavior.HttpsGetEnabled = true;
50+
behavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
51+
}))
52+
.AddDefaultBinding(binding);
4653
}
4754

4855
public void Configure(IApplicationBuilder builder)

‎Solid.AspNetCore.Extensions.Wcf.Tests/Solid.AspNetCore.Extensions.Wcf.Tests.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.0.1" />
1111
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
1212
<PackageReference Include="Moq" Version="4.8.2" />
13-
<PackageReference Include="Solid.Testing.AspNetCore" Version="1.0.16" />
13+
<PackageReference Include="Solid.Testing.AspNetCore" Version="1.1.3-beta" />
1414
<PackageReference Include="xunit" Version="2.3.1" />
1515
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
1616
</ItemGroup>

‎Solid.AspNetCore.Extensions.Wcf/Factories/DefaultMessageFactory.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public Task<Message> CreateMessageAsync(HttpContext http, BindingContext binding
3232
message.Properties.Via = request.GetRequestUri();
3333
if (message.Headers.Action == null)
3434
message.Headers.Action = request.Headers["SOAPAction"].Select(s => s.Trim('"')).FirstOrDefault();
35-
35+
3636
return Task.FromResult(message);
3737
}
3838

‎Solid.AspNetCore.Extensions.Wcf/Providers/ServiceHostProvider.cs

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Text;
77
using System.Threading;
88
using System.Threading.Tasks;
9+
using Microsoft.Extensions.Configuration;
910
using Microsoft.Extensions.DependencyInjection;
1011
using Solid.AspNetCore.Extensions.Wcf.Abstractions;
1112
using Solid.AspNetCore.Extensions.Wcf.Builders;
@@ -45,6 +46,9 @@ public ServiceHostProvider(
4546

4647
private ServiceHost Initialize()
4748
{
49+
var config = _provider.GetService<IConfiguration>();
50+
var https = config["HTTPS_PORT"] != null;
51+
4852
var baseAddresses = _baseAddresses.GetBaseAddressesFor<TService>();
4953
var singleton = default(TService);
5054
if(typeof(TService).GetServiceLifetime() == ServiceLifetime.Singleton)

‎Solid.AspNetCore.Extensions.Wcf/ServiceModel/Channels/AspNetCore/AspNetCoreTransportBindingElement.cs

+7-12
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
namespace Solid.AspNetCore.Extensions.Wcf.ServiceModel.Channels.AspNetCore
1111
{
12-
internal class AspNetCoreTransportBindingElement : TransportBindingElement
12+
internal class AspNetCoreTransportBindingElement : HttpTransportBindingElement
1313
{
1414
internal IMessageFactory MessageFactory { get; }
1515

@@ -26,21 +26,16 @@ public AspNetCoreTransportBindingElement(string scheme, IAspNetCoreHandler handl
2626
_loggerFactory = loggerFactory;
2727
}
2828

29-
protected AspNetCoreTransportBindingElement(string scheme, IAspNetCoreHandler handler, IMessageFactory factory, ILoggerFactory loggerFactory, TransportBindingElement elementToBeCloned)
30-
: base(elementToBeCloned)
31-
{
32-
Scheme = scheme;
33-
Handler = handler;
34-
MessageFactory = factory;
35-
36-
_loggerFactory = loggerFactory;
37-
}
38-
3929
public override string Scheme { get; }
4030

4131
public override BindingElement Clone()
4232
{
43-
return new AspNetCoreTransportBindingElement(Scheme, Handler, MessageFactory, _loggerFactory, this);
33+
return new AspNetCoreTransportBindingElement(Scheme, Handler, MessageFactory, _loggerFactory);
34+
}
35+
36+
public override bool CanBuildChannelFactory<TChannel>(BindingContext context)
37+
{
38+
return false;
4439
}
4540

4641
public override bool CanBuildChannelListener<TChannel>(BindingContext context)

‎Solid.AspNetCore.Extensions.Wcf/Services/BindingSanitizer.cs

+49-12
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,20 @@
88
using Microsoft.Extensions.DependencyInjection;
99
using Microsoft.Extensions.Logging;
1010
using Solid.AspNetCore.Extensions.Wcf.ServiceModel.Channels.AspNetCore;
11+
using Microsoft.AspNetCore.Hosting.Server;
12+
using Microsoft.AspNetCore.Hosting.Server.Features;
1113

1214
namespace Solid.AspNetCore.Extensions.Wcf.Services
1315
{
1416
internal class BindingSanitizer : IBindingSanitizer
1517
{
1618
private IServiceProvider _services;
19+
private IServer _server;
1720

18-
public BindingSanitizer(IServiceProvider services)
21+
public BindingSanitizer(IServiceProvider services, IServer server)
1922
{
2023
_services = services;
24+
_server = server;
2125
}
2226

2327
public Binding SanitizeBinding(Binding binding)
@@ -37,19 +41,52 @@ public Binding SanitizeBinding(Binding binding)
3741
}
3842

3943
private void Replace<TTransport>(CustomBinding custom)
40-
where TTransport : TransportBindingElement
44+
where TTransport : HttpTransportBindingElement
4145
{
4246
var current = custom.Elements.OfType<TTransport>().FirstOrDefault();
43-
if (current != null)
44-
{
45-
custom.Elements.Remove(current);
46-
//custom.Elements.Add(new HttpTransportBindingElement());
47-
var handler = _services.GetService<IAspNetCoreHandler>();
48-
var factory = _services.GetService<IMessageFactory>();
49-
var loggerFactory = _services.GetService<ILoggerFactory>();
50-
var aspNetCore = new AspNetCoreTransportBindingElement(current.Scheme, handler, factory, loggerFactory);
51-
custom.Elements.Add(aspNetCore);
52-
}
47+
if (current == null) return;
48+
if (current is AspNetCoreTransportBindingElement) return;
49+
50+
custom.Elements.Remove(current);
51+
//custom.Elements.Add(new HttpTransportBindingElement());
52+
var handler = _services.GetService<IAspNetCoreHandler>();
53+
var factory = _services.GetService<IMessageFactory>();
54+
var loggerFactory = _services.GetService<ILoggerFactory>();
55+
var scheme = GetScheme(current);
56+
var aspNetCore = new AspNetCoreTransportBindingElement(scheme, handler, factory, loggerFactory);
57+
58+
aspNetCore.AllowCookies = current.AllowCookies;
59+
aspNetCore.AuthenticationScheme = current.AuthenticationScheme;
60+
aspNetCore.BypassProxyOnLocal = current.BypassProxyOnLocal;
61+
aspNetCore.DecompressionEnabled = current.DecompressionEnabled;
62+
aspNetCore.ExtendedProtectionPolicy = current.ExtendedProtectionPolicy;
63+
aspNetCore.HostNameComparisonMode = current.HostNameComparisonMode;
64+
aspNetCore.KeepAliveEnabled = current.KeepAliveEnabled;
65+
aspNetCore.ManualAddressing = current.ManualAddressing;
66+
aspNetCore.MaxBufferPoolSize = current.MaxBufferPoolSize;
67+
aspNetCore.MaxBufferSize = current.MaxBufferSize;
68+
aspNetCore.MaxPendingAccepts = current.MaxPendingAccepts;
69+
aspNetCore.MaxReceivedMessageSize = current.MaxReceivedMessageSize;
70+
aspNetCore.MessageHandlerFactory = current.MessageHandlerFactory;
71+
aspNetCore.ProxyAddress = current.ProxyAddress;
72+
aspNetCore.ProxyAuthenticationScheme = current.ProxyAuthenticationScheme;
73+
aspNetCore.Realm = current.Realm;
74+
aspNetCore.RequestInitializationTimeout = current.RequestInitializationTimeout;
75+
aspNetCore.TransferMode = current.TransferMode;
76+
aspNetCore.UnsafeConnectionNtlmAuthentication = current.UnsafeConnectionNtlmAuthentication;
77+
aspNetCore.UseDefaultWebProxy = current.UseDefaultWebProxy;
78+
aspNetCore.WebSocketSettings = current.WebSocketSettings;
79+
80+
custom.Elements.Add(aspNetCore);
81+
}
82+
83+
private string GetScheme(HttpTransportBindingElement original)
84+
{
85+
var feature = _server.Features[typeof(IServerAddressesFeature)] as IServerAddressesFeature;
86+
var addresses = feature.Addresses.Select(s => new Uri(s));
87+
88+
if (addresses.Any(u => u.Scheme == "https")) return original.Scheme;
89+
return "http";
5390
}
5491
}
5592
}

0 commit comments

Comments
 (0)
Please sign in to comment.