Activer l'Authentification de Base pour un simple service WCF?
J'ai une question très simple WCF webservice qu'un client est un hébergement sur leur propre IIS.
Le client dispose de son propre client qu'il ai été le tester contre, dans leur environnement de test, et tout fonctionnait bien, jusqu'à ce qu'ils désactivé l'authentification anonyme et activé de base. Une fois qu'ils ont fait, ils ont commencé à recevoir des erreurs:
The authentication schemes configured on the host ('Basic') do not allow those configured on the binding 'BasicHttpBinding' ('Anonymous'). Please ensure that the SecurityMode is set to Transport or TransportCredentialOnly.
Alors, que dois-je faire pour obtenir l'authentification de base de travail?
Mon webservice actuelle web.config
:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
</system.serviceModel>
</configuration>
J'ai mon propre client de test, que je peux courir à l'encontre de mon webservice. Son actuel app.config
:
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IMyServiceSvc" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/MyServiceSvc.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyServiceSvc"
contract="MyServiceSvc.IMyServiceSvc"
name="BasicHttpBinding_IMyServiceSvc" />
</client>
</system.serviceModel>
</configuration>
Quand j'ai installer le service sur mon serveur IIS local, et d'exécuter le client contre elle, tout fonctionne, avec l'authentification anonyme est activée.
Que dois-je faire pour activer l'authentification de base, dans IIS, et de configurer à la fois le client et le serveur pour utiliser l'authentification de base?
Mon test de code de client:
public class BlackHillsCompletionSvcTest
{
static void Main(string[] args)
{
using (var client = new MyServiceSvcClient())
{
var data = new Data
{
id = "1",
description = "test data"
};
try
{
var result = client.receiveData(data);
}
catch (Exception ex)
{
var msg = ex.Message;
}
}
}
}
==Tentatives:==
Comme par Pankaj Kapare de la suggestion, j'ai ajouté ceci à la webservice de web.config
:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="httpBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
</bindings>
...
</system.serviceModel>
Avec qui, j'ai eu une erreur lors de la création du client:
The binding at system.serviceModel/bindings/basicHttpBinding does not have a configured binding named 'BasicHttpBinding_IMyServiceSvc'. This is an invalid value for bindingConfiguration.
J'ai donc ajouté ceci à la charge du client app.config
:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IMyServiceSvc">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
</bindings>
...
</system.serviceModel>
Avec cela, j'ai une autre erreur:
The username is not provided. Specify username in ClientCredentials.
Donc j'ai ajouté le nom d'utilisateur et le mot de passe de mon client:
using (var client = new MyServiceSvcClient())
{
client.ClientCredentials.UserName.UserName = "myusername";
client.ClientCredentials.UserName.Password = "mypassword";
...
}
Et avec qui, je reçois encore une autre erreur:
The requested service, 'http://localhost/MyServiceSvc.svc' could not be activated. Which got me wondering. So I loaded the .svc page in my browser, was asked to log in, and after I did, I saw this:
The authentication schemes configured on the host ('Basic') do not allow those configured on the binding 'BasicHttpBinding' ('Anonymous'). Please ensure that the SecurityMode is set to Transport or TransportCredentialOnly. Additionally, this may be resolved by changing the authentication schemes for this application through the IIS management tool, through the ServiceHost.Authentication.AuthenticationSchemes property, in the application configuration file at the <serviceAuthenticationManager> element, by updating the ClientCredentialType property on the binding, or by adjusting the AuthenticationScheme property on the HttpTransportBindingElement.
Qui est de ce que le client voit.
Idées?
== Peut-être une solution? ==
Je pense que, peut-être le manque d'une définition de service, sur le serveur, en liant la liaison à l'ordinateur d'extrémité:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="httpBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service
name="MyServiceSvcNs.MyServiceSvc"
behaviorConfiguration="ServiceWithMetaData"
>
<endpoint name="Default"
address=""
binding="basicHttpBinding"
bindingConfiguration="httpBinding"
contract="MyServiceSvcNs.IMyServiceSvc"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceWithMetaData">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
</system.serviceModel>
Avec cette, les choses semblent être au travail. Au moins au premier coup d'œil.
OriginalL'auteur Jeff Dege | 2015-01-22
Vous devez vous connecter pour publier un commentaire.
OK, j'ai tout compris.
Tout d'abord, dans le Gestionnaire des services internet., vous devez désactiver l'authentification anonyme, et activer l'authentification de base. Qui peut demander l'activation de l'authentification de base d'abord, puis de redémarrer le Gestionnaire des services IIS. C'est la base IIS trucs, et pas vraiment partie de ma question.
Ensuite, nous avons besoin de faire des modifications sur le site web du service web.config. Si vous vous souvenez, il avait été comme ça:
Nous avons besoin de le changer:
Ce que nous allons faire est de définir un basicHttpBinding avec TransportCredentialOnly de sécurité. Ensuite, nous définissons un service, avec un point de terminaison qui utilise cette liaison.
Puis sur le client, nous avons eu:
Cela doit changer:
Ici, nous sommes à nouveau la création d'un basicHttpBinding avec TransportCredentialOnly de sécurité, nous sommes à la modification de l'extrémité de l'utiliser.
OriginalL'auteur Jeff Dege
Configurer vous basicHttpBinding dans le service web.config comme suit
Êtes-vous en envoyant nom d'utilisateur et le mot de passe à la demande? Vous pouvez poster votre code client?
Main pas été. Je suis maintenant. Toujours pas de travail. Voir les modifications apportées à mon post original.
Avec ma configuration en place et définition du nom d'utilisateur/mot de passe sur le client, vous devez faire une modification de plus c'est à dire bindingConfiguration="BasicHttpBinding_IMyServiceSvc" à bindingConfiguration="httpBinding". Ne pas utiliser le mode="Transport" si vous avez besoin de https.
Toujours de voir "Le service demandé, 'localhost/MyServiceSvc.svc " ne peut pas être activé."
OriginalL'auteur Pankaj Kapare