2016-02-06 11 views
10

In ASP.NET regolare si potrebbe fare questo in un fine di determinare se la richiesta corrente era da localhost:In ASP.NET Core come si controlla se la richiesta è locale?

HttpContext.Current.Request.IsLocal

ma non riesco a trovare qualcosa di simile in ASP.NET 6/core/qualunque cosa sia destinata a essere chiamata.

Grazie in anticipo

+2

Prestare attenzione all'utilizzo di 'HttpContext.Connection.IsLocal'. Mi sembra che l'uso di 'HttpContext.Connection.RemoteIpAddress' è ** modo più sicuro **. Se mi collego per testare localmente il progetto RC1 di ASP.NET 5, vedo ':: 1' in 'RemoteIpAddress', ma' HttpContext.Connection.IsLocal' è 'false'. È sbagliato. – Oleg

+0

Cheers Oleg, quello che hai detto si è rivelato vero anche per me. –

+0

Anche io ho lo stesso comportamento.È sempre '' 'false''' localmente. –

risposta

9

mi sono imbattuto in questa ricerca di una soluzione per sapere se una richiesta è locale. Sfortunatamente la versione 1.1.0 di ASP.NET non ha un metodo IsLocal su una connessione. Ho trovato una soluzione su un sito web chiamato Strathweb ma non è aggiornato.

Ho creato la mia estensione IsLocal e sembra funzionare, ma non posso dire di averlo provato in tutte le circostanze, ma siete invitati a provarlo.

public static class IsLocalExtension 
{ 
    private const string NullIpAddress = "::1"; 

    public static bool IsLocal(this HttpRequest req) 
    { 
     var connection = req.HttpContext.Connection; 
     if (connection.RemoteIpAddress.IsSet()) 
     { 
      //We have a remote address set up 
      return connection.LocalIpAddress.IsSet() 
        //Is local is same as remote, then we are local 
       ? connection.RemoteIpAddress.Equals(connection.LocalIpAddress) 
        //else we are remote if the remote IP address is not a loopback address 
       : IPAddress.IsLoopback(connection.RemoteIpAddress); 
     } 

     return true; 
    } 

    private static bool IsSet(this IPAddress address) 
    { 
     return address != null && address.ToString() != NullIpAddress; 
    } 
} 

Si chiama in un azione di controllo di utilizzare il bene Request, vale a dire

public IActionResult YourAction() 
{ 
    var isLocal = Request.IsLocal(); 
    //... your code here 
} 

Mi auguro che aiuta qualcuno.

+1

Questo mi ha aiutato. [Qui] (https://gist.github.com/firelizzard18/74e7481fb97c16b90bfd801798f53319) è la mia versione. –

5

ora il suo

HttpContext.Connection.IsLocal 

e se avete bisogno di controllare che al di fuori di un controller poi si prende una dipendenza da IHttpContextAccessor per ottenere l'accesso ad essa.

aggiornamento sulla base di un commento:

HttpContext è intrinsecamente disponibile in Vista

@if (Context.Connection.IsLocal) 
{ 

} 
+0

Prendo la dipendenza dalla vista facendo questo '@inject IHttpContextAccessor Context;' giusto? Attualmente è locale è sempre falso ... –

+5

Questo sta andando via in RC2. Filip ha un approccio alternativo qui: http://www.strathweb.com/2016/04/request-islocal-in-asp-net-core/ ma anche sembra dipendere pesantemente da altri middleware e da quale server stai usando . – ssmith

0

Al momento della scrittura HttpContext.Connection.IsLocal è ora mancante da dotnet core.

Altri assegni di soluzione di lavoro solo per un primo indirizzo di loopback (:: 1 o 127.0.0.1) che potrebbe non essere adeguato.

trovo la soluzione qui di seguito utile:

using Microsoft.AspNetCore.Http; 
using System.Net; 

namespace ApiHelpers.Filters 
{ 
    public static class HttpContextFilters 
    { 
     public static bool IsLocalRequest(HttpContext context) 
     { 
      if (context.Connection.RemoteIpAddress.Equals(context.Connection.LocalIpAddress)) 
      { 
       return true; 
      } 
      if (IPAddress.IsLoopback(context.Connection.RemoteIpAddress)) 
      { 
       return true; 
      } 
      return false; 
     } 
    } 
} 

E il caso ad esempio uso:

app.UseWhen(HttpContextFilters.IsLocalRequest, configuration => configuration.UseElmPage()); 
0

Vorrei anche ricordare che può essere utile per aggiungere la clausola di seguito per la fine del vostro personalizzato IsLocal() controllo

if (connection.RemoteIpAddress == null && connection.LocalIpAddress == null) 
{ 
    return true; 
} 

Questo spiegherebbe lo scenario in cui il il sito viene eseguito utilizzando Microsoft.AspNetCore.TestHost e il sito viene eseguito interamente localmente nella memoria senza una vera connessione TCP/IP.

Problemi correlati