Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In ASP.NET Core how do you check if request is local?

In the regular ASP.NET you could do this in a view to determine if the current request was from localhost:

HttpContext.Current.Request.IsLocal

But I can't find something similar in ASP.NET 6/Core/whatever it is meant to be called.

like image 907
marvc1 Avatar asked Feb 06 '16 11:02

marvc1


People also ask

How does ASP.NET Core process a request?

The ASP.NET Core web server will convert the response from the application logic into a raw HTTP response and sends it back to the reverse proxy. The reverse proxy will then send it back to the browser.

How do I know if an application is .NET Core?

NET Core is installed on Windows is: Press Windows + R. Type cmd. On the command prompt, type dotnet --version.

What is a local URL?

A URL is considered local if it does not have a host / authority part and it has an absolute path. URLs using virtual paths ('~/') are also local.


1 Answers

UPDATE: ASP.NET Core 2.0 has a method called Url.IsLocalUrl (see this Microsoft Docs).

I think this code will work, but I haven't been able to test it completely

var callingUrl = Request.Headers["Referer"].ToString(); var isLocal = Url.IsLocalUrl(callingUrl); 

But see Will Dean's comment below about this approach:

Anyone thinking about using the 'updated' version which checks the Referrer header should bear in mind that headers are extremely easy to spoof, to a degree that doesn't apply to loopback IP addresses.


Original solution

I came across this looking for a solution to knowing if a request is local. Unfortunately ASP.NET version 1.1.0 does not have a IsLocal method on a connection. I found one solution on a web site called Strathweb but that is out of date too.

I have created my own IsLocal extension, and it seems to work, but I can't say I have tested it in all circumstances, but you are welcome to try it.

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;     } } 

You call it in a controller action from using the Request property, i.e.

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

I hope that helps someone.

like image 176
Jon P Smith Avatar answered Sep 20 '22 15:09

Jon P Smith