Question

Je développe des services WCF avec basicHttpBinding , ces services devraient être accessibles en utilisant .net 1.1 & 2.0 .net, à cet effet, je me sers basicHttpBinding .
Dans les anciens services Web ASMX J'Assed un savon en-tête (AuthHeader) pour authentifier l'utilisateur à chaque demande.
Comment puis-je authentifier WCF en utilisant basicHttpBinding Tout échantillon ou tutoriel utile.


NRK

Était-ce utile?

La solution

Vous pouvez utiliser AuthHeader comme vous le faisiez avant de passer à WCF. Peut-être qu'il sera plus convinient pour vous, faites les princples restent les mêmes. La mauvaise chose que je vois dans cette solution est un transfert de mot de passe de texte brut. Quoi qu'il en soit, il est juste une autre option et vous pouvez crypter / décrypter le mot de passe en quelque sorte.

Dans ce cas, vous devez implémenter votre propre votre IDispatchMessageInspector & IClientMessageInspector, comme

[AttributeUsage(AttributeTargets.Class)]
public class CredentialsExtractorBehaviorAttribute : Attribute, IContractBehavior, IDispatchMessageInspector
{
    #region IContractBehavior implementation.

    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint,
                                      DispatchRuntime dispatchRuntime)
    {
        dispatchRuntime.MessageInspectors.Add(this);
    }

    ... empty interface methods impl skipped ...

    #endregion

    #region IDispatchMessageInspector implementation.

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        int i = request.Headers.FindHeader("username", "sec");
        if (-1 != i)
        {
            string username = request.Headers.GetHeader<string>("username", "sec");
            ... do smth ...
        }
        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        return;
    }

    #endregion
}

Dans un échantillon i placé à-tête uniquement le nom d'utilisateur, mais vous pouvez mettre en œuvre votre classe contenant le nom d'utilisateur et mot de passe et de l'utiliser au lieu de chaîne. Sur le client:

internal class CredentialsInserter : IContractBehavior, IClientMessageInspector
{
    private string m_username;

    public CredentialsInserter(string username)
    {
        m_username = username;
    }

    #region IContractBehavior implementation.

    ... empty interface methods impl skipped ...

    public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint,
                                    ClientRuntime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(this);
    }

    #endregion

    #region IClientMessageInspector implementation.

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        MessageHeader<string> mh = new MessageHeader<string>(m_username);
        request.Headers.Add(mh.GetUntypedHeader("username", "sec"));
        return null;
    }

    public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        return;
    }

    #endregion
}

Ensuite, vous devez placer sur votre attribut CredentialsExtractorBehaviorAttribute classe d'implémentation de services.

[CredentialsExtractorBehavior]
public class DummyService : IDummyService
{
   ... impl ...
}

Et du côté client, vous devez faire ce qui suit:

        using (DummyServiceClient c = new DummyServiceClient("TcpEndpoint"))
        {
            c.ChannelFactory.Endpoint.Contract.Behaviors.Add(
                new CredentialsInserter("_username_"));
            c.DummyMethod();
        }

Autres conseils

D'abord - oui vous pouvez! Cela dépend si vous utilisez ou un message de liaison de transport -. Si vous êtes connecté à Internet, vous êtes plus susceptible d'utiliser la sécurité basée sur des messages-

Malheureusement, pour la sécurité à base de messages, basicHttpBinding ne supporte que des certificats qui est un peu une douleur.

wsHttpBinding d'autre part soutiendrait le nom d'utilisateur / mot de passe ou d'autres méthodes aussi.

Vous souhaitez configurer wsHttpBinding avec des informations d'identification du client nom d'utilisateur / mot de passe sur la sécurité à base de messages comme celui-ci:

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsUserName">
          <security mode="Message">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="yourservice">
        <endpoint name="YourEndpoint"
                  address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="wsUserName"
                  contract="IYourService" />
      </service>
    </services>
  </system.serviceModel>

La section sous <bindings> définit une configuration de liaison pour wsHttpBinding qui utilise message de sécurité avec des informations d'identification client nom d'utilisateur / mot de passe.

La section sous <service> définit un exemple de service qui utilise wsHttpBinding et que les références que la configuration de liaison que nous venons de définir.

Du côté du serveur, vous pouvez maintenant utiliser le nom d'utilisateur / mot de passe qui est envoyé sur le fil pour valider vos correspondants soit dans votre Active Directory (tous appelant a besoin d'un compte AD avec vous), ou dans le système d'adhésion ASP.NET base de données; ou si vous devez vraiment vraiment, vous pouvez écrire votre propre mécanisme d'authentification, aussi.

Trouvez beaucoup d'informations utiles sur WCF sécurité à Codeplex -. excellente ressource

Vérifier les scénarios ici pour essayer de faire correspondre un à votre situation. Chaque scénario est muni d'un chceklist des éléments nécessaires pour mettre en œuvre la solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top