2015-12-19 20 views
13

Possiedo un sito Web asp.net-mvc e ora ho bisogno di esporre alcune delle mie chiamate a applicazioni esterne che sono utilizzate solo all'interno del mio sito in questo momento. Questo sta accadendo tutto all'interno di una intranet all'interno della mia azienda.Esporre alcune chiamate da un sito asp.net-mvc esistente ad altri client REST all'interno di una intranet?

Ho letto this page che spiega l'API Web rispetto alle azioni del controller e allo as this SOF question che sembra avere un problema simile ma le risposte sembrano un po 'obsolete. Quindi sto cercando di determinare le ultime funzionalità disponibili, qual è la soluzione più semplice per soddisfare le mie esigenze.

Nel mio caso, dal momento che ho già utilizzato le stesse azioni del controller nel mio sito Web corrente, l'API WEB non ha senso, ma se io google qualcosa intorno all'autenticazione asp.net-mvc o alla sicurezza vedo solo articoli sul Web API.

Dato ciò, sto cercando di capire le migliori pratiche per esporre l'azione del mio controller a un'altra applicazione.

+1

Vorrei convertire le azioni in Web API Controller e rendere il sito Web e le applicazioni utilizzano le stesse azioni. Sarà più facile che configurare i controller MVC da utilizzare dall'esterno, come indica la risposta SO. –

risposta

9

In un mondo ideale si potrebbe convertire l'applicazione ai controllori API Web come qualcun altro ha suggerito, ma per essere più pragmatico è possibile implementare una soluzione temporanea in cui si espone solo le chiamate necessarie tramite l'estensione ApiController

Lei non ha menzionato quale versione di MVC sta utilizzando la tua app attuale né hai menzionato il modo in cui i tuoi attuali controllori restituiscono i dati all'app Web. Pertanto supporrò che tu restituisca i dati tramite un modello di vista e le visualizzazioni del rasoio. es .:

Supponiamo ora di voler esporre l'elenco prodotti tramite un'API simile a REST? In primo luogo, controllare che siano api Web installato (tramite NuGet)

Installare-Pacchetto Microsoft.AspNet.WebApi

(ancora una volta non sono sicuro che cosa ver di asp.net si è in così questo processo può variare tra le versioni)

Ora nel tuo public void Application_Start()

GlobalConfiguration.Configure(WebApiConfig.Register);//add this before! line below 
RouteConfig.RegisterRoutes(RouteTable.Routes);//this line shld already exist 

e in WebApiConfig

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

mi piace creare un apposito cartella chiamato ApiControllers e aggiungere controllori con lo stesso nome; in questo modo è possibile avere regolatori con gli stessi nomi come sono in diversi spazi dei nomi:

namespace YourApp.Web.ApiControllers 
{ 
    [AllowAnonymous] 
    public class ProductsController : ApiController 
    { 
     [HttpGet] 
     public HttpResponseMessage Products() 
     { 
       var result = new ProductResult();//you could also use the view class ProductsListView 
       result.Products = _repository.GetProducts(); 
       return Request.CreateResponse(httpStatusCode, result); 
     } 
    } 
} 

è quindi possibile accedere a questo tramite yourapp.com/api/products

nb, provare a ridurre la duplicazione del codice all'interno di controllori - questo può essere acheived estraendo parti comuni in classi di servizio.

2

Mentre si consiglia vivamente di utilizzare un'architettura di servizi Web, come Web API o ServiceStack, è possibile esporre le azioni del controller.

Prima di tutto devi decorare le azioni con l'attributo [AllowAnonymous]. Quindi, nel tuo web.config dovrai aggiungere il seguente blocco di codice alla sezione configuration per ogni azione che desideri venga esposta.

<location path="ControllerNameHere/ActionNameHere"> 
    <system.web> 
     <authorization> 
      <allow users="*" /> 
     </authorization> 
    </system.web> 
</location> 

Come avrete intuito, questo diventa molto ripetitivo e fastidioso, che è il motivo per cui i servizi web sarebbe una grande scelta.

2

Avevo un requisito simile in cui il sito Web 2 richiedeva di chiamare alcune azioni del controller dal sito Web 1. Poiché non c'erano modifiche nella logica, volevo evitare l'intera riscrittura utilizzando l'API Web. Ho creato un altro set di controller e azioni che restituirebbero Json. Le nuove azioni del controller chiamerebbero le azioni del controller originale e quindi convertiranno i dati dei risultati in json prima di tornare. Le altre applicazioni (sito Web 2) farebbero quindi richieste http per ricevere e inviare richieste per ottenere dati json e deserializzarli internamente. Ha funzionato bene nel mio caso.

Non ho dovuto inserire un livello di sicurezza sulle azioni basate su JSON come erano pubbliche, ma potrebbe essere necessario uno per autenticare le richieste.

0

Sebbene webapi sia il modo migliore ma non è necessario convertire il controller/azioni in webapi.

Si potrebbe facilmente ottenere quello che si sta cercando limitando il controller/azioni da indirizzi IP dalla tua intranet. Assicurati che tutti i siti intranet risiedano nello stesso dominio. Altre chiamate jquery ajax su più domini non funzioneranno. Ecco un esempio. Restrict access to a specific controller by IP address in ASP.NET MVC Beta

Un'alternativa è quella di utilizzare l'autenticazione di base e solo consentire a un hardcoded userid/password per accedere a quelle del controller/azioni e chiamare tramite la tecnologia AJAX:

beforeSend: function (XHR) { xhr.setRequestHeader ("Autorizzazione" , "Base" + btoa (username + ":" + password)); },