2012-06-12 1 views
1

J'ai un service WCF basichttpbinding qui s'exécutait en utilisant le mode de sécurité de transport. Cela fonctionne très bien mais je voudrais authentifier l'utilisateur qui demande ce service a donc essayé d'utiliser le mode de sécurité de TransportWithMessagCredential et le message clientCredentialType de UserName et ajouté un comportement de service pour appeler le validateur de mot de passe personnalisé. Mon problème est quand j'essaye d'employer le studio visuel pour appeler la référence j'obtiens une erreur indiquant que le service n'a pas pu être trouvé. S'il vous plaît trouver mon code ci-dessous et suggérer des modifications que je pourrais avoir besoin de faire pour que cela fonctionne et m'indiquer un nom d'utilisateur/mot de passe lorsque vous essayez d'ajouter le service.nom d'utilisateur/mot de passe personnalisé dans le service Web ssl

Web.config

<?xml version="1.0"?> 
<configuration> 
<system.diagnostics> 
<sources> 
    <source name="System.ServiceModel" switchValue="Information, ActivityTracing" 
    propagateActivity="true"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
     <add initializeData="WcfTraces.svclog" type="System.Diagnostics.XmlWriterTraceListener" 
     name="traceListener"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
    <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\**\web_messages.svclog" 
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral,  PublicKeyToken=***" 
    name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp"> 
    <filter type="" /> 
    </add> 
</sharedListeners> 
</system.diagnostics> 
<system.serviceModel> 
<diagnostics> 
    <messageLogging logEntireMessage="true" logMalformedMessages="true" 
    logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="true" /> 
</diagnostics> 
<bindings> 
    <basicHttpBinding> 
    <binding name="basicBindingConfig"> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="None" /> 
     <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration="ServiceBehavior" name="nameSpaceX.Service"> 
    <endpoint address="https://************:443/***.svc/" 
     binding="basicHttpBinding" bindingConfiguration="basicBindingConfig" 
     contract="nameSpaceY.IService"> 
     <identity> 
     <certificateReference x509FindType="FindByThumbprint" findValue="****************" /> 
     </identity> 
    </endpoint> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" 
     httpsGetUrl="https://*****:443/***.svc" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     <serviceCredentials> 
     <userNameAuthentication userNamePasswordValidationMode="Custom" 
      customUserNamePasswordValidatorType="namespaceX.UserNameValidator, namespaceX" /> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
</system.serviceModel> 

</configuration> 

userNameValidator.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IdentityModel.Selectors; 
using System.IdentityModel.Tokens; 

namespace namespaceX 
{ 
class UserNameValidator: UserNamePasswordValidator 
{ 
    public override void Validate(string username, string password) 
    { 
     if(username == "test" && password == "1234") 
      return; 
     throw new SecurityTokenException("Incorrect username or Password"); 
    } 
} 
} 
+1

"J'essaie d'utiliser Visual Studio pour appeler la référence" - pouvez-vous clarifier ce que vous faites exactement et le détail des messages d'erreur? –

+0

Fondamentalement, lorsque j'essaie de naviguer dans le service dans mon navigateur, j'obtiens: Description: HTTP 404. La ressource que vous recherchez (ou l'une de ses dépendances) aurait pu être supprimée, avait changé de nom ou était temporairement indisponible. Veuillez vérifier l'URL suivante et assurez-vous qu'elle est épelée correctement. Cela se produit lorsque tout ce que j'ai changé dans le service consiste à utiliser TransportwithMessageCredential et les comportements de service comme décrit ci-dessus. Lorsque vous utilisez uniquement la sécurité de transport, cela fonctionne très bien. Cependant, je dois le sécuriser avec un nom d'utilisateur/mot de passe. –

+0

Essayez-vous HTTPS: //...*.svc lorsque vous voyez 404? C'est vraiment étrange. La sécurité ne doit pas déplacer votre point de terminaison. –

Répondre

0

Vous n'avez pas besoin de chemin * .svc ici. Habituellement httpsGetUrl attribut est ignoré ou stocke ...? Wsdl

<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" 
    httpsGetUrl="https://*****:443/***.svc" /> 

qui a été dit avec hypothèse que l'URL est le même que celui de terminaison de service ici. Ti devrait être différent parce que l'un est la mise en œuvre et le second est les métadonnées.

+0

cela est nécessaire, sinon WCF pointe vers le nom de la machine au lieu du nom de domaine lorsque le service est créé –

+0

J'ai mis à jour ma réponse. –

+0

dsicovered mon erreur. Quand j'ai navigué à https: // *****: 443/***. Svc j'ajouterais un slash supplémentaire à la fin comme suit https: // *****: 443/***. Svc/et il l'a cassé. Vraiment stupide. Merci pour votre aide de toute façon –

Questions connexes