Passare il cookie FormsAuthentication a un servizio WCF

Ho un sito Web che comunica con un servizio Web WCF remoto. Entrambi utilizzano lo stesso provider FormsAuthentication personalizzato. Mi piacerebbe autenticarmi con il servizio WCF che impersona l’utente attualmente loggato nel sito. L’ho già fatto manualmente, utilizzando le credenziali del client UserName, ma ho bisogno di conoscere la password dell’utente. Quindi, ciò che funziona così scoreggia è questo: un utente autenticato fa una richiesta, creo un client di servizio e imposto le sue credenziali:

serviceClient.ClientCredentials.UserName.UserName = username; serviceClient.ClientCredentials.UserName.Password = password; 

Ma quello che voglio veramente è passare il cookie di FormsAuthentication direttamente, perché non voglio memorizzare la password dell’utente.

Qualche idea?

Sembra che tu stia cercando il servizio di autenticazione di Windows Communication Foundation .

MODIFICARE:

Dopo aver riletto la domanda con più attenzione (e dopo il commento di Ariel) vorrei ritirare il suggerimento di cui sopra. Il servizio di autenticazione WCF non aggiungerà molto a questo scenario.

Non l’ho fatto tra WCF e ASP.NET, tuttavia ho configurato le applicazioni ASP.NET per condividere i moduli autenticati, forse posso aiutare in qualche modo.

Per garantire che entrambe le applicazioni possano crittografare / decifrare il cookie di autenticazione dei moduli allo stesso modo, è necessario configurare l’elemento per entrambe le applicazioni (in web.config o machine.config a seconda che si desideri eseguire questa operazione sulla macchina o sull’applicazione livello). Dovresti esaminare gli attributi validation , validationKey , decryption e decryptionKey .

Assicurati che i tuoi elementi in entrambi i file web.config siano configurati in modo simile. Specificamente il name , il path e gli attributi del domain .

È probabile che ciò si applichi solo ai cookie trasmessi a / da un browser Web (ma potrebbe essere utile in questo caso): Per consentire ai cookie di essere trasmessi tra i siti http://www.foo.com e bar.foo.com si configureranno i forms elemento come segue per consentire ai cookie di essere impostati su un sito e passati con successo all’altro:

  

Passare il cookie al servizio WCF è probabile che sia un po ‘complicato. Non ho molta esperienza con WCF, quindi ho adattato il codice di kennyw.com :

 HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, ""); using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel)) { OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; serviceClient.MethodName(); } 

Se si sta ospitando WCF in IIS (e non in auto-hosting) è ansible passare la richiesta WCF attraverso la pipeline di elaborazione ASP.NET impostando

    

Se si è self-hosting, è ansible esaminare le intestazioni delle richieste utilizzando le proprietà del messaggio in entrata in OperationContext.Current.IncomingMessageProperties e ottenere il valore del cookie di autenticazione dei moduli e decodificarlo utilizzando FormsAuthentication.Decrypt(string) .

Non ho idea se tutto ciò funzionerebbe, ma mi piacerebbe sapere se lo fa!

È abbastanza semplice da fare se si ospita il servizio WCF all’interno del sito IIS autenticato.

Abilita la compatibilità aggiungendo quanto segue alla tua sezione system.ServiceModel nel tuo web.config

    

Quindi decorare ogni servizio che si desidera accettare il cookie con il seguente

 [AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

Ora l’object HttpContext.Current.User.Identity verrà popolato correttamente e sarà inoltre ansible utilizzare le richieste di PrinciplePermission per limitare l’accesso in base al ruolo o a determinati utenti.