2011-11-22 12 views
18

Problemi nell'utilizzo dell'autenticazione di base con un semplice servizio di verifica Wcf. Ricevo un'eccezione:Wcf Autenticazione di base

Il servizio richiesto, "http: //qld-tgower/test/Service.svc" non può essere attivato. Consulta i log di traccia diagnostica> del server per ulteriori informazioni.

E nel Registro di traccia si vede:

Gli schemi di autenticazione configurati sull'host ('base') non consentono quelli configurati sul legame 'BasicHttpBinding' ('Anonimo'). Assicurarsi che SecurityMode sia impostato su Transport o TransportCredentialOnly. Inoltre, ciò può essere risolto modificando gli schemi di autenticazione per questa applicazione tramite lo strumento di gestione IIS, tramite la proprietà ServiceHost.Authentication.AuthenticationSchemes, nel file di configurazione dell'applicazione nell'elemento <serviceAuthenticationManager>, aggiornando la proprietà ClientCredentialType sul bind, o regolando la proprietà AuthenticationScheme su HttpTransportBindingElement.

Ma quello che don capisco quando noi il nome utente e la password non corretta si dice che IS utilizzando l'autenticazione di base?

La richiesta HTTP non è autorizzata con lo schema di autenticazione client 'Base'. L'intestazione di autenticazione ricevuta dal server era 'Basic realm = "qld-tgower"'.

Questo è il mio dettagli web.config

<system.serviceModel> 
<services> 
    <service name="WcfService" 
     behaviorConfiguration="Behavior"> 
    <endpoint address="http://QLD-TGOWER/test/Service.svc" 
       binding="basicHttpBinding" 
       bindingConfiguration="httpBinding" 
       contract="IService" /> 
    </service> 
</services> 
<diagnostics> 
    <endToEndTracing activityTracing="false" messageFlowTracing="true" propagateActivity="true"></endToEndTracing> 
</diagnostics> 
<bindings> 
    <basicHttpBinding> 
    <binding name="httpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic" proxyCredentialType="Basic"> 
     </transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="true"/> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
</system.serviceModel> 

e questo è il mio app.config

<system.serviceModel> 
    <diagnostics> 
     <endToEndTracing activityTracing="true" /> 
     <messageLogging logMessagesAtTransportLevel="true" /> 
    </diagnostics> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IService" > 
      <security mode="TransportCredentialOnly"> 

      <transport clientCredentialType="Basic" proxyCredentialType="Basic"></transport> 
      <message clientCredentialType="UserName" /> 
      </security> 

     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://QLD-TGOWER/test/Service.svc" binding="basicHttpBinding" 
     bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService" 
     name="BasicHttpBinding_IService" /> 
    </client> 
</system.serviceModel> 

la mia applicazione di test

private static void Main(string[] args) 
{ 
    var proxy = new ServiceClient("BasicHttpBinding_IService"); 
    var clientCredentials = proxy.ClientCredentials; 
    clientCredentials.UserName.UserName = "username"; 
    clientCredentials.UserName.Password = "password"; 
    var res = proxy.GetData(1); 
    Console.WriteLine(res); 
    Console.WriteLine("Done"); 
    Console.ReadKey(true); 
} 

E il mio servizio

public class Service : IService 
{ 

    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

C'è qualcosa che mi manca qui?

risposta

17

Modificare il nome e il contratto del servizio per includere lo spazio dei nomi.

Inoltre, rimuovere l'indirizzo dell'endpoint (impostarlo su "") e non includere proxyCredentialType nel tag di trasporto.

risultato finale del web.config dovrebbe essere simile a questo

<system.serviceModel> 

    <services> 
     <service name="MyNameSpace.MyService" behaviorConfiguration="asdf"> 
     <endpoint address="" binding="basicHttpBinding" 
      bindingConfiguration="httpBinding" contract="MyNameSpace.IMyService" /> 
     </service> 
    </services> 

    <diagnostics> 
     <endToEndTracing activityTracing="true" messageFlowTracing="true" 
      propagateActivity="true"> 
     </endToEndTracing> 
    </diagnostics> 

    <bindings> 
     <basicHttpBinding> 
     <binding name="httpBinding"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="asdf"> 
      <!-- To avoid disclosing metadata information, set the value below to 
       false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true" /> 
      <!-- To receive exception details in faults for debugging purposes, 
       set the value below to true. Set to false before deployment to avoid 
       disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 

     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <serviceHostingEnvironment multipleSiteBindingsEnabled="false"/> 

    </system.serviceModel> 
2

prova per entrambi i client e server configurazioni

<basicHttpBinding> 
    <binding name="BasicHttpBinding_IService"> 
     <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" /> 
     </security> 
    </binding> 
</basicHttpBinding> 

Installa/Abilita autenticazione di base

Potrebbe anche essere necessario installare e applicare l'autenticazione di base in IIS.

Vai a "Programmi e funzionalità"/"Attiva/disattiva funzionalità di Windows". Abilita "autenticazione di base" da qualche parte sotto IIS e sicurezza.

Ho chiuso e aperto la console IIS e sono riuscito ad abilitarlo sotto le impostazioni di autenticazione.

Questo naturalmente se per un test di sviluppo e ti avvisa di non avere un certificato SSL.

+0

Grazie, Questo ha corretto gli errori di autenticazione, ma ora il servizio va nello stato di errore. Non c'è nulla nei registri di traccia per indicare il motivo. – TheRealTy

1

È proibito utilizzare l'autenticazione nome utente su una connessione non protetta

È possibile proteggere il messaggio utilizzando un trasporto sicuro (ad esempio SSL) o la crittografia dei messaggi (tramite le certificazioni)

ho usato ClearUsernameBinding in passato per un grande successo, ma non lo consiglio in produzione. L'ho usato in modo che potessi mantenere tutto il mio codice di autenticazione lo stesso senza richiedere SSL in ambienti di sviluppo/test, ma avendo a che fare con SSL modificando solo la configurazione.

Nota: l'associazione personalizzata non è perfetta e ho dovuto modificarla un po 'per consentire alcune modifiche alla configurazione.

0

Questo è ciò che ha risolto il problema per me:

<bindings> 
    <basicHttpBinding> 
    <binding> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Per riferimento vedi: https://msdn.microsoft.com/en-gb/library/ff648505.aspx