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");
}
}
}
"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? –
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. –
Essayez-vous HTTPS: //...*.svc lorsque vous voyez 404? C'est vraiment étrange. La sécurité ne doit pas déplacer votre point de terminaison. –