Domanda

Qual è l'approccio migliore per essere sicuri di dover eseguire l'autenticazione solo una volta quando si utilizza un'API basata su WCF?

I miei attuali attacchi e comportamenti sono elencati di seguito

    <bindings>
        <wsHttpBinding>
            <binding name="wsHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="true"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="NorthwindBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>

Il prossimo è ciò che sto utilizzando nella mia app client per l'autenticazione (attualmente devo farlo ogni volta che voglio effettuare una chiamata in WCF)

Dim client As ProductServiceClient = New ProductServiceClient("wsHttpProductService")
client.ClientCredentials.UserName.UserName = "foo"
client.ClientCredentials.UserName.Password = "bar"
Dim ProductList As List(Of Product) = client.GetProducts()

Quello che vorrei fare è autenticarsi con l'API una volta utilizzando queste credenziali, quindi ottenere un tipo di token per il periodo di tempo in cui la mia applicazione client utilizza il progetto del servizio Web.Pensavo cheestablishsecuritycontext=true facesse questo per me?

È stato utile?

Soluzione

Se utilizzi una Intranet, l'autenticazione di Windows può essere gestita "gratuitamente" solo tramite configurazione.

Se ciò non è appropriato, i servizi token funzionano bene, ma per alcune situazioni potrebbero essere semplicemente eccessivi.

L'applicazione su cui sto lavorando necessitava di un'autenticazione semplice.Il nostro server e client vengono eseguiti all'interno di una intranet (molto sicura), quindi non ci siamo preoccupati troppo del requisito di utilizzare un certificato X.509 per crittografare la comunicazione, che è richiesto se si utilizza l'autenticazione del nome utente.

Quindi abbiamo aggiunto a comportamento personalizzato al client che aggiunge il nome utente e la password (crittografata) alle intestazioni dei messaggi e un altro comportamento personalizzato sul server che li verifica.

Tutto molto semplice, non richiede modifiche al livello di accesso al servizio lato client o all'implementazione del contratto di servizio.E poiché tutto avviene tramite configurazione, se e quando avremo bisogno di passare a qualcosa di un po' più potente, sarà facile migrare.

Altri suggerimenti

Anche se detesto dare una risposta di cui non sono sicuro al 100%, la mancanza di risposte finora mi fa pensare che una risposta potenzialmente corretta potrebbe andare bene in questo caso.

Per quanto ne so, non esiste il tipo di meccanismo dei token di sessione che stai cercando immediatamente con WCF, il che significa che dovrai fare un lavoro pesante per far funzionare le cose nel nel modo che preferisci.Dovrei chiarire che esiste un meccanismo di sessione in WCF ma è focalizzato sulla garanzia degli ordini di messaggi e non è lo strumento ideale per creare una sessione di autenticazione.

Ho appena finito di lavorare su un progetto in cui abbiamo implementato il nostro meccanismo di sessione per gestire tutti i tipi di stack SOAP legacy, ma credo che il modo consigliato per implementare sessioni autenticate sia utilizzare un Secure Token Service (STS) come Di Pablo Cibraro.

Se vuoi maggiori dettagli per favore grida, ma sospetto che il blog di Pablo conterrà informazioni più che sufficienti per farti andare avanti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top