Domanda

Tutto questo riguarda l'associazione WebHttp, ospitata in un host di servizio personalizzato (IIS non è attualmente un'opzione).

Ho implementato un UserNamePasswordValidator personalizzato e un IAuthorizationPolicy personalizzato. Quando configuro l'associazione dell'endpoint per utilizzare l'autenticazione di base, tutto funziona esattamente come vorrei (principale personalizzato, ruoli personalizzati, ecc.).

Vorrei aggiungere anche la possibilità di accesso HTTP anonimo e le mie implementazioni personalizzate mettono l'utente Anonimo in alcuni ruoli predefiniti, ecc. (se non viene inviata alcuna intestazione Authenticate).

Quello che succede ora è che agli utenti anonimi viene assegnato un 401 prima che venga colpito uno qualsiasi del mio codice personalizzato. Se disattivo il requisito di autenticazione HTTP di base, l'intestazione Authenticate viene ignorata del tutto.

Come posso configurare, o iniettare un'intestazione Authenticate , per farlo in entrambi i modi (senza creare 2 endpoint separati)?

È stato utile?

Soluzione

Prima di tutto, il servizio risponde correttamente alla chiamata anonima, secondo la specifica .

Secondo, questo è impossibile. Quando si ospita autonomamente il servizio e si dispone di alcuni collegamenti HTTP, WCF utilizzerà un System.Net.HttpListener per essere in grado di rispondere alle richieste http (create in System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen ) . Questo listener ha un metodo chiamato HandleAuthentication che viene chiamato molto prima che venga chiamato il tuo codice personalizzato. È responsabile dell'invio della risposta 401 con la sfida (WWW-Authenticate). Non c'è niente che tu possa fare al riguardo. Se c'è, mi piacerebbe saperlo.

Quindi ti rimangono le seguenti opzioni:

  • due endpoint
  • configura i tuoi clienti per conoscere le credenziali predefinite
  • cambia i tuoi clienti in modo che possano rispondere alla sfida

Altri suggerimenti

Ho fatto ricerche su questo in passato e ho scoperto che non è possibile attraverso la configurazione a meno che non si creino 2 endpoint separati (che non è quello che si desidera). Semplicemente non è supportato da WCF.

Tuttavia, WCF è estremamente personalizzabile e potresti probabilmente farlo scrivendo un canale / associazione personalizzato che farà ciò che desideri. Ti consiglio di dare un'occhiata al REST Chess codice sorgente . Dovrebbe iniziare.

La soluzione migliore è implementare ruoli predefiniti tramite un provider di ruoli e consentire agli utenti anonimi di unirsi automaticamente a quel ruolo. Quindi, a livello di programmazione o tramite la politica di inserimento delle politiche (orientata all'aspetto), impostare in modo tale che un determinato accesso anonimo sia consentito tramite il ruolo specifico.

Per quanto riguarda l'impostazione tramite configurazione, se possibile, sarebbe piuttosto difficile e una specie di "hacky".

Non credo ... Stavo solo scrivendo che devi creare per separare l'endpoint quando ho deciso di rileggere la tua domanda e ho notato l'ultima affermazione della tua domanda. Quindi la risposta sarebbe no (di cui sono a conoscenza)

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