I have an ASP.NET MVC website that makes use of WebAPI, SignalR.
I wish for my server (the same server that hosts the website) to make HTTP requests to a WebAPI controller - I wish to do this so that I can hook into my website's SignalR functionality.
I want to make it so that the websites users can't access the methods on the WebAPI controller, but the server can.
I have looked at the options for securing WebAPI requests generally and it seems like I have the following options available to me:
- Send a username and password over each request AKA Basic Authentication
- Generate a "Client Certificate" and send that with each request
These are the only two methods that sound like they would work, but I wonder if it's overkill to use these methods if the requests are going to originate from localhost (the same server).
Is it overkill, is there an easier way to restrict HTTP requests from the local machine to a WebAPI controller?
If you ONLY wanted to accept requests that originated from the same machine, you could check the
IsLocal
property of the request context MSDN.You could then build it into a custom authorize attribute and register it globally, enforcing the requirement on all of your Web API controllers.
I wanted to clarify as to whether
HttpRequest.Context.Request.IsLocal
is secure or not.I just decomplied
IsLocal()
fromHttpWorkerRequest
and it reveals the following code:The first two checks look fine, but I was suspicious and wanted to check to see what
this.GetLocalAddress()
returns to check against.In the instance of
System.Web.Hosting.IIS7WorkerRequest
, this decompiles to the following:In my local environment this returns 127.0.0.1, so all looks good!
Also, according to this post, localhost can't be spoofed.