Un caso di utilizzo comune per WebAPI è il rendering delle viste della shell da parte dei controller MVC, che contengono javascript che quindi raggiunge l'API per accedere ai dati.Come rendere le azioni WebAPI accessibili solo dalla mia app?
Ma supponiamo che tu abbia alcune costose operazioni API e non vuoi che le persone accedano da remoto a questi endpoint: desideri solo che le tue visualizzazioni MVC, fornite dalla tua applicazione, accedano a esse. Come puoi andare a proteggerli?
In questo caso, Request.IsLocal
non funziona, perché javascript lo sta invocando dal browser del client sul proprio computer. Anche se funzionasse, è necessario scavare per ottenere il vero HttpContext
per trovare questa proprietà - e quella soluzione non funzionerebbe in WebAPI self-hosted.
Per gli endpoint API che richiedono uno IPrincipal
valido, è possibile proteggerli con l'attributo [Authorize]
. Ma per quanto riguarda gli endpoint API a cui vuoi che l'app sia in grado di accedere per gli utenti anonimi?
Ho provato una soluzione e la pubblicherò separatamente come risposta, perché non sono sicuro che sia l'approccio migliore (o addirittura buono).
E se volessi che l'azione fosse accessibile agli utenti anonimi? – danludwig
@danludwig - limitare l'accesso a una risorsa costosa e fornire un accesso illimitato ad esso sono requisiti in conflitto. Hai bisogno di prendere una decisione. –
@danludwig, quindi le cose stanno andando fuori controllo. Semplicemente non puoi farlo. Con la definizione stessa di un utente anonimo, significa che può chiamare qualsiasi endpoint. E anche se chiami l'API Web solo dai tuoi controller e non da javascript, l'utente anonimo potrebbe comunque chiamare indirettamente il controller. –