Wcf l'authentification de Base
Quelques soucis à l'aide de l'authentification de base avec un simple test de service Wcf. J'obtiens une exception:
Le service demandé, 'http://qld-tgower/test/Service.svc" ne peut pas être activé. Voir l' > serveur de diagnostic des journaux de suivi pour plus d'informations.
Et dans le journal de suivi, il montre:
Les schémas d'authentification est configuré sur l'hôte ("Base") ne permettent pas à ceux configurés sur la liaison "BasicHttpBinding' ("Anonyme"). Veuillez vous assurer que le SecurityMode est définie pour le Transport ou l'TransportCredentialOnly. En outre, cela peut être résolu en modifiant les schémas d'authentification pour cette application par le biais de l'outil de gestion IIS, par le biais de la ServiceHost.L'authentification.AuthenticationSchemes de la propriété, dans le fichier de configuration d'application à la <serviceAuthenticationManager> élément, par la mise à jour de la ClientCredentialType bien sur la liaison, ou en ajustant la AuthenticationScheme bien sur la HttpTransportBindingElement.
Mais ce que je ne comprends quand je nous le mauvais nom d'utilisateur et le mot de passe qu'il dit qu'il EST à l'aide de l'authentification de base?
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="qld-tgower"'.
C'est mon web.config détails
<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>
et c'est l'une de mes applications.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>
mon test de l'application
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);
}
Et mon service
public class Service : IService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
}
Il y a une chose qui me manque ici?
Vous devez vous connecter pour publier un commentaire.
Modifier le nom et le contrat de service pour inclure l'espace de noms.
En outre, retirer l'adresse de point de terminaison (réglé à "") et ne comprennent pas les proxyCredentialType dans le transport de la balise.
Résultat final de tout le web.config devrait ressembler à quelque chose comme ceci
Essayer pour le client et le serveur configs
Installer/Activer l'authentification de base
Vous pouvez aussi avoir besoin d'installer et d'appliquer l'authentification de base dans IIS.
Goto "Programmes et Fonctionnalités" /"Activer les fonctionnalités de windows/off ".
Activer "authentification de base" quelque part sous IIS et de la sécurité.
J'ai fermé et ouvert la console IIS et a été en mesure d'activer les sous paramètres d'authentification.
Cela bien sûr, si pour un test de développement, et il vous avertit de ne pas avoir un certificat SSL.
Vous n'êtes pas autorisé à utiliser les nom d'utilisateur d'authentification sur une connexion non sécurisée
Vous pouvez obtenir le message en utilisant un transport en toute sécurité (par exemple, SSL) ou le chiffrement des messages (à l'aide de certificats)
J'ai utilisé ClearUsernameBinding dans le passé à un grand succès, mais je ne le recommande pas dans la production. Je l'ai utilisé pour que je puisse garder mes code d'authentification de la même sans exiger SSL dev/environnements de test, mais avoir travailler avec SSL par la modification de la configuration.
Remarque: cette liaison personnalisée n'est pas parfait, et j'ai dû changer un peu pour permettre à certaines modifications de configuration.
C'est ce qui a résolu le problème pour moi:
Pour référence, voir:
https://msdn.microsoft.com/en-gb/library/ff648505.aspx