0

So I am trying to create a WCF Service that uses SSL and with a Custom Authenticator.

This is the Server config:

<?xml version="1.0"?>


<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2"/>
  </system.web>
  <system.serviceModel>

    <bindings>
      <wsHttpBinding>
        <binding name="SSL">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <services>
      <service behaviorConfiguration="CustomValidation" name="WCFService.Service1">
        <endpoint address="" binding="wsHttpBinding" contract="WCFService.IService1" bindingConfiguration="SSL"/>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="CustomValidation">
          <serviceMetadata httpsGetEnabled="true" />
          <serviceDebug httpsHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFService.Verification, WCFService" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>  

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="false"/>
  </system.webServer>

</configuration>

This is my Validation Class:

Imports System.IdentityModel.Selectors

Public Class Verification
    Inherits UserNamePasswordValidator

    Public Overrides Sub Validate(userName As String, password As String)

        If Not (username = "Admin" AndAlso password = "Fake Password") Then
            Throw New Exception("Wrong Username Password combination.")
        End If

    End Sub

End Class

App Config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.diagnostics>
        <sources>
            <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                    <add name="ServiceModelMessageLoggingListener">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
        </sources>
        <sharedListeners>
            <add initializeData="c:\users\connor smith\documents\visual studio 2015\projects\wcfserviceconsumer\wcfserviceconsumer\app_messages.svclog"
                type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
                <filter type="" />
            </add>
        </sharedListeners>
        <trace autoflush="true" />
    </system.diagnostics>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <system.serviceModel>
        <diagnostics>
            <messageLogging logEntireMessage="true" logMalformedMessages="true"
                logMessagesAtTransportLevel="true" />
        </diagnostics>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IService1">
                    <security mode="TransportWithMessageCredential">
                        <transport clientCredentialType="None" />
                        <message clientCredentialType="UserName" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://mysite.co.uk/WCFService/Service1.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1"
                contract="AService.IService1" name="WSHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

I consume it in a test application, then I set the Username and Password to be Admin and Fake Password, then I go to use the service and get the following error: Error

Edit: Some more error information:

'An unhandled exception of type 'System.ServiceModel.ProtocolException' occurred in mscorlib.dll'

Am I missing something?

  • The WCF service is returning a 500 error, you should be able to enable WCF logging to extract the error, and it may also be logged in the event log. This will give additional information as to what the actual failure is. – ChrisBint Apr 15 '16 at 10:27
  • @ChrisBint I've looked in the Event Log and there isn't anything that refers to the service (presumably it's under 'Windows Logs > Application'?). I think I have logging enabled, followed [link](http://stackoverflow.com/questions/4271517/how-to-turn-on-wcf-tracing) steps to and I don't get any file... – Connor_Smith14 Apr 15 '16 at 10:56

0 Answers0