Подтвердить что ты не робот

Выявление нескольких звонков с существующего сайта asp.net-mvc на другие клиенты REST внутри интрасети?

У меня есть существующий веб-сайт asp.net-mvc, и теперь мне нужно разоблачить несколько моих вызовов внешним приложениям, которые используются только на моем сайте прямо сейчас. Все это происходит внутри интрасети внутри моей компании.

Я прочитал эту страницу, в которой также объясняются действия Web API и действия с контроллером как этот SOF вопрос, который, похоже, имеет аналогичную проблему, но ответы кажутся немного устаревшими. Поэтому я пытаюсь определить, учитывая последние доступные функции, что является самым простым решением для удовлетворения моих требований.

В моем случае, поскольку у меня уже есть те же действия контроллера, что и на моем текущем веб-сайте, тогда WEB API на самом деле не имеет смысла, но если я что-нибудь расскажу о проверке подлинности asp.net-mvc или безопасности, я вижу только статьи по веб-API,

Учитывая это, я пытаюсь найти наилучшую практику для того, чтобы подвергнуть действие моего контроллера другому приложению.

4b9b3361

Ответ 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 (имя пользователя + ":" + пароль)); },