La requête HTTP n'est pas autorisée avec le schéma d'authentification client 'Basic'. L'en-tête d'authentification reçu du serveur était 'Basic realm = "pc"'
Serveur:
<system.serviceModel>
<services>
<service name="Service" behaviorConfiguration="md">
<!-- Service Endpoints -->
<endpoint address="SslService" binding="basicHttpBinding" bindingConfiguration="security" contract="IService"/>
<host>
<baseAddresses>
<add baseAddress="https://pc:8080/Service.svc"/>
</baseAddresses>
</host>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="security">
<security mode="Transport">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="md">
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="ClassLibrary1.CustomUserNameValidator, ClassLibrary1" />
</serviceCredentials>
<serviceMetadata httpsGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
ClassLibrary1.CustomUserNameValidato:
public class CustomUserNameValidator : System.IdentityModel.Selectors.UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (userName != "111" || password != "111")
{
throw new System.ServiceModel.FaultException("Unknown username or incorrect password");
}
}
}
Client:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="Basic" proxyCredentialType="Basic" realm="">
<extendedProtectionPolicy policyEnforcement="Never" />
</transport>
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://pc:8080/Service.svc/SslService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService"
name="BasicHttpBinding_IService" />
</client>
</system.serviceModel>
ServiceReference1.ServiceClient s = new WindowsFormsApplication1.ServiceReference1.ServiceClient();
s.ClientCredentials.UserName.UserName = "111";
s.ClientCredentials.UserName.UserName = "111";
MessageBox.Show(s.GetData(3)); //<---- ERROR
La requête HTTP est autorisée avec le schéma d'authentification client "de Base". L'en-tête d'authentification reçues du serveur a été " Basic realm="pc"'.
source d'informationauteur RendeRR
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que vous hébergez votre servicehost sur IIS. Puis le problème est que l'IIS intercepte la requête https et exécute IIS authentification au niveau de l'avant de la WCF cadre et votre validateur personnalisé a une chance de coup de pied dans.
Dans votre exemple, les services internet (IIS) effectivement regarder pour un utilisateur local '111' mot de passe '111' sur le serveur qui exécute IIS. Essayez de créer cet utilisateur sur le serveur, et vous aurez probablement obtenir un résultat différent.
Une solution est d'héberger votre WCF servicehost ailleurs, par exemple dans un Service Windows. Une autre solution est de changer votre régime de sécurité à TransportWithMessageCredential. Enfin, vous pouvez vérifier ce OSS module http: Personnalisé l'Authentification de Base pour IIS - semble faire l'affaire dont nous avons besoin.
J'avais créé un client comme ceci:
La section de la sécurité de ma liaison ressemblait à ceci:
Et j'ai vu cette erreur revenir. Une fois j'ai corrigé le mot de passe, tout a fonctionné.
Essayez d'envoyer nom d'utilisateur et mot de passe pas en http avec l'authentification de base (ce qui peut embarrasser IIS), mais seulement dans la fabrication du savon-en-têtes de message avec le schéma suivant:
Comment faire: Utiliser de la Sécurité des Transports et le Message d'informations d'Identification
Peut-être que vous aussi vous devez aussi spécifier
<transport clientCredentialType="None">
Semble que vous définissez le nom d'utilisateur deux fois au lieu du nom d'utilisateur et mot de passe.
Lorsque vous avez l'authentification de base et de ne pas envoyer le nom d'utilisateur et le mot de passe à la demande, vous obtenez un défi de réponse en retour.
J'ai posté une réponse ici: Ne pouvez pas appeler le service web avec l'authentification de base en utilisant WCF
transport
clientcredentialType
estTransportCredentialOnly