Выявление нескольких звонков с существующего сайта asp.net-mvc на другие клиенты REST внутри интрасети?
У меня есть существующий веб-сайт asp.net-mvc, и теперь мне нужно разоблачить несколько моих вызовов внешним приложениям, которые используются только на моем сайте прямо сейчас. Все это происходит внутри интрасети внутри моей компании.
Я прочитал эту страницу, в которой также объясняются действия Web API и действия с контроллером как этот SOF вопрос, который, похоже, имеет аналогичную проблему, но ответы кажутся немного устаревшими. Поэтому я пытаюсь определить, учитывая последние доступные функции, что является самым простым решением для удовлетворения моих требований.
В моем случае, поскольку у меня уже есть те же действия контроллера, что и на моем текущем веб-сайте, тогда WEB API на самом деле не имеет смысла, но если я что-нибудь расскажу о проверке подлинности asp.net-mvc или безопасности, я вижу только статьи по веб-API,
Учитывая это, я пытаюсь найти наилучшую практику для того, чтобы подвергнуть действие моего контроллера другому приложению.
Ответы
Ответ 1
В идеальном мире вы конвертируете приложение в web-api-контроллеры, как кто-то другой, но, чтобы быть более прагматичным, вы можете реализовать временное решение, в котором вы можете выставить только требуемые вызовы с помощью расширения ApiController
Вы не указали, какая версия MVC используется вашим текущим приложением, и вы не указали, как ваши текущие контроллеры возвращают данные в веб-приложение.
Поэтому я предполагаю, что вы возвращаете данные через представление модели и виды бритвы. например:
public class ProductsController : Controller
{
public void Index()
{
var view = new ProductsListView();
view.Products = _repository.GetProducts();
return View(view);
}
}
Предположим, теперь вы хотите открыть список продуктов через RIE-api?
Сначала проверьте, что вы установили web api (через nuget)
Установочный пакет Microsoft.AspNet.WebApi
(опять-таки я не уверен, что из версии asp.net вы находитесь, поэтому этот процесс может отличаться между версиями)
Теперь в public void Application_Start()
GlobalConfiguration.Configure(WebApiConfig.Register);//add this before! line below
RouteConfig.RegisterRoutes(RouteTable.Routes);//this line shld already exist
и 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 }
);
}
}
Мне нравится создавать выделенную папку под названием ApiControllers и добавлять контроллеры с тем же именем; таким образом, вы можете иметь контроллеры с теми же именами, что и в разных пространствах имен:
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);
}
}
}
Затем вы можете получить доступ к этому через yourapp.com/api/products
nb, попытайтесь уменьшить дублирование кода внутри контроллеров - это может быть достигнуто путем извлечения общих частей в классы обслуживания.
Ответ 2
Хотя я бы настоятельно рекомендовал использовать архитектуру веб-сервисов, такую как Web API или ServiceStack, вы можете выявить действия контроллера.
Сначала вы хотите украсить действия атрибутом [AllowAnonymous]
. Затем в вашем web.config вам нужно добавить следующий блок кода в раздел configuration
для каждого действия, которое вы хотите открыть.
<location path="ControllerNameHere/ActionNameHere">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
Как вы, возможно, догадались, это становится очень повторяющимся и раздражающим, поэтому веб-сервисы будут отличным выбором.
Ответ 3
У меня было аналогичное требование, когда веб-сайт 2 требовал вызвать некоторые действия контроллера с веб-сайта 1. Поскольку в логике не было изменений, я хотел избежать всего переписывания с использованием веб-API. Я создал еще один набор контроллеров и действий, которые вернут Json. Новые действия контроллера вызовут исходные действия контроллера и затем преобразуют данные результата в json перед возвратом. Другие приложения (веб-сайт 2) будут затем обрабатывать HTTP-запросы и отправлять сообщения для получения json-данных и десериализовать их внутри. Хорошо работал в моем случае.
Мне не нужно было устанавливать уровень безопасности над действиями на основе json, поскольку они были общедоступными, но вам может понадобиться аутентификация запросов.
Ответ 4
Хотя webapi - лучший способ, но вам не нужно вообще конвертировать ваш контроллер/действия в webapi.
Вы можете легко достичь того, что вам нужно, ограничив контроллер/действия по IP-адресам из вашей интрасети. Просто убедитесь, что все сайты интрасети находятся в одном домене. Другие межсетевые jQuery jQuery не будут работать.
Вот пример. Ограничить доступ к определенному контроллеру по IP-адресу в бета-версии ASP.NET MVC
Альтернативой является использование базовой проверки подлинности и только для жесткого кода пользователя/пароля для доступа к этому контроллеру/действиям и вызова через ajax:
beforeSend: function (xhr) { xhr.setRequestHeader( "Авторизация", "Базовый" + btoa (имя пользователя + ":" + пароль));
},