2015-06-01 12 views
6

Ho un sito Web ASP.NET MVC che utilizza WebAPI, SignalR.Come proteggere un controller su WebAPI per l'utilizzo solo dalla macchina locale

Desidero che il mio server (lo stesso server che ospita il sito Web) effettui richieste HTTP a un controller WebAPI: desidero farlo in modo che possa collegarmi alla funzionalità SignalR del mio sito web.

Voglio fare in modo che gli utenti dei siti Web non possano accedere ai metodi sul controller WebAPI, ma il server può.

Ho guardato le opzioni per la protezione richieste WebAPI generale e sembra che ho le seguenti opzioni disponibili per me:

  • Invia un nome utente e una password su ogni richiesta AKA autenticazione di base
  • Generare un "Certificato cliente" e inviarlo a ogni richiesta

Questi sono gli unici due metodi che sembrano funzionare, ma mi chiedo se è eccessivo usare questi metodi se le richieste provengono da localh ost (lo stesso server).

È eccessivo, esiste un modo più semplice per limitare le richieste HTTP dalla macchina locale a un controller WebAPI?

risposta

10

Se si desiderava SOLO accettare richieste originate dalla stessa macchina, è possibile controllare la proprietà IsLocal del contesto di richiesta MSDN.

HttpRequest.Context.Request.IsLocal 

È quindi possibile costruire in un attributo Autorizza personalizzato e registrarlo a livello globale, far rispettare il requisito di tutti i controller di Web API.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Other Web API configuration code goes here 

     // This is a globally registered attribute 
     config.Filters.Add(new LocalRequestOnlyAttribute()); 
    } 
} 

public class LocalRequestOnlyAttribute : AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext context) 
    { 
     return context.RequestContext.IsLocal; 
    } 
} 
+0

Ottimo, ho appena iniziato la ricerca su 'IsLocal' ma non sono sicuro se sia sicuro o meno. Convalida se l'IP è '127.0.0.1',' :: 1' o l'indirizzo IP della macchina corrente. Mi chiedo solo se può essere falsificato. – Luke

+0

Ci sono state domande esattamente su SO (http://stackoverflow.com/questions/19010217/is-request-islocal-secure-or-can-it-be-spoofed) ma non ho trovato alcuna risposta suggerire che può essere falsificato. Anche le cattive intestazioni inoltrate da un proxy non dovrebbero essere in grado di ingannarlo. Questa risposta arriva addirittura a definirlo completamente affidabile. http: // StackOverflow.it/questions/7148821/request-islocal –

+0

Grande, ho appena decomplicato e ho visto il codice. Pubblicherò anche le mie conclusioni come risposta. Grazie! – Luke

1

ho voluto chiarire come se HttpRequest.Context.Request.IsLocal è sicura o no.

ho appena decomplied IsLocal() da HttpWorkerRequest e rivela il seguente codice:

internal bool IsLocal() 
{ 
    string remoteAddress = this.GetRemoteAddress(); 
    if (string.IsNullOrEmpty(remoteAddress)) 
    { 
     return false; 
    } 
    if (remoteAddress == "127.0.0.1" || remoteAddress == "::1") 
    { 
     return true; 
    } 
    if (remoteAddress == this.GetLocalAddress()) 
    { 
     return true; 
    } 
    return false; 
} 

I primi due controlli guardare bene, ma ero sospettoso e voluto controllare per vedere che cosa this.GetLocalAddress() torna a controllare contro.

Nel caso di System.Web.Hosting.IIS7WorkerRequest, questo decompila al seguente:

public override string GetLocalAddress() 
{ 
    return this.GetServerVariable("LOCAL_ADDR"); 
} 

Nel mio ambiente locale restituisce 127.0.0.1, quindi tutto sembra buono!

Inoltre, in base a this post, il localhost non può essere falsificato.