2011-08-17 3 views
8

Stiamo sviluppando un servizio Web REST WCF che riceve solo un gruppo di testo arbitrario da qualsiasi utente anonimo e quindi esegue l'elaborazione sul back-end.Servizio WCF REST - 401 Non autorizzato

Per esempio, ecco un metodo dal nostro servizio web:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
public class MyRESTService : IMyRESTService 
{ 
    [WebInvoke(Method = "PUT", UriTemplate = "/MyRESTMethod?paramA={paramA}&paramB={paramB}")] 
    public Stream MyRESTMethod(string paramA, string paramB, Stream rawData) 
    { 
     //do some stuff... 
    } 
} 

Se usiamo le impostazioni di IIS predefinite otteniamo un (401) Unauthorized. Tuttavia, dopo molte prove ed errori, abbiamo capito che potevamo farlo funzionare dando accesso WRITE a "Everyone" sul file effettivo .svc per il nostro servizio.

La mia domanda è: perché nel mondo IIS avrebbe bisogno di avere accesso in WRITE a un file .svc perché funzioni? C'è un modo migliore o sono bloccato con questa soluzione (e forse insicura) hackish?

WTF Microsoft?

possibilmente correlate:

+0

I diritti di accesso non necessariamente deve essere concessa a "Everyone". Invece l'utente autenticato deve avere questi diritti. Per l'accesso anonimo questo è IUSR. – chiccodoro

risposta

7

Dopo aver parlato con un rappresentante tecnico da M $ sono stato informato che questo è davvero il comportamento previsto. Il servizio deve avere abilitato l'accesso in scrittura per consentire a qualcuno di inviare una richiesta e, quando lo si fa, verrà impostato automaticamente anche l'accesso in scrittura sul file .SVC.

+0

Hai salvato la mia giornata! A proposito: pensandoci una seconda volta questo ha un senso: quando richiedi un PUT su una risorsa, quella risorsa deve consentire l'accesso in scrittura. Ora, suppongo che REST con WCF sia probabilmente implementato in modo tale che IIS interpreti un PUT /foobar.svc/some/path come una richiesta PUT su /foobar.svc e inoltra la parte "/ some/path" a WCF per ulteriori interpretazioni. Quindi, per IIS questa è una richiesta PUT su /foobar.svc - in linguaggio HTTP: vuoi modificare foobar.svc – chiccodoro

9

ho trovato anche questo può essere risolto mettendo

<authentication mode="None" /> all'interno di <system.web> nei vostri web.config

+0

questo mi ha aiutato, ma è sicuro? –

+0

Dipende dal tuo ambiente. Nel mio caso, ci siamo fidati che la rete fosse sicura, e forse questo è sufficiente. Se hai bisogno di un'autenticazione diretta tra i servizi, ovviamente questo sarà un problema. – captncraig