2011-04-03 6 views
1

Je souhaite authentifier les utilisateurs d'un service WCF par rapport à des membres et des fournisseurs de rôles personnalisés, mais je ne souhaite pas que le trafic soit sécurisé avec un certificat.WCF avec MembershipProvider personnalisé et aucun certificat X.509, possible?

Est-il possible d'utiliser basicHttpBinding en transmettant des informations d'identification personnalisées sans certificat?

Je demande parce que j'ai un service WCF avec toute la plomberie fournisseur d'appartenance etc câblé via config et hébergé sous IIS, mais les détails de l'utilisateur ne sont pas transmis à IIS.

J'ai un WAN où le réseau est sécurisé, donc je ne suis pas préoccupé par le cryptage des messages.

La compatibilité ASP.Net a été activée, config est comme ci-dessous. Tout est .Net 4.0;

<?xml version="1.0"?> 
<configuration> 
<system.web> 
<compilation debug="true" targetFramework="4.0" /> 
<membership defaultProvider="DemoMembershipProvider" userIsOnlineTimeWindow="15"> 
    <providers> 
    <clear /> 
    <add name="DemoMembershipProvider" type="DemoMembershipProvider" connectionStringName="SqlConn" applicationName="TestProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Clear" /> 
    </providers> 
</membership> 
<roleManager enabled="true" defaultProvider="DemoRoleProvider" > 
    <providers> 
    <clear/> 
    <add name="DemoRoleProvider" connectionStringName="blah" applicationName="TestProvider" type="DemoRoleProvider" /> 
    </providers> 
</roleManager> 
<customErrors mode="Off" /> 
</system.web> 
<system.serviceModel> 
<services> 
    <service name="DataService"> 
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BindingConfiguration" contract="IDataService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BindingConfiguration"> 
     <security mode="None"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceCredentials> 
     <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="DemoMembershipProvider" /> 
     </serviceCredentials> 
     <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="DemoRoleProvider" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
</system.webServer> 
</configuration> 

Le code client est;

  Console.WriteLine("Calling with valid credentials"); 
     using (var y = new DataServiceRef.DataServiceClient()) 
     { 
      y.ClientCredentials.UserName.UserName = "ryan"; 
      y.ClientCredentials.UserName.Password = "password"; 
      Console.WriteLine("Result: {0}", y.GetData("blah")); 
     } 

Répondre

5

Vous devez utiliser la liaison personnalisée parce que les liaisons par défaut ne prennent pas en charge l'envoi de nom d'utilisateur et mot de passe sans canal sécurisé (soit le transport ou la sécurité des messages où les deux exigent un certificat). Utilisez cette liaison personnalisée:

<customBinding> 
    <binding name="UsernamePasswordOverHttp"> 
    <textMessageEncoding messageVersion="Soap11" /> 
    <security 
     authenticationMode="UserNameOverTransport" 
     messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10" 
     allowInsecureTransport="true" /> 
    <httpTransport /> 
    </binding> 
</customBinding> 

Une autre solution utilise ClearUserNameBinding.

Questions connexes