2015-03-06 5 views
0

Я мог бы действительно помочь с этим. В двух словах, я пытаюсь сделать запрос междоменного (CORS) из локально размещенного приложения Cordova в веб-API ASP.NET, который также размещается локально. Проблема заключается в том, что мое клиентское приложение и веб-API используют разные порты, поэтому требуется поддержка CORS. Я пробовал несколько разных вещей, чтобы обойти это, но пока не повезло. Вот некоторые особенности:Предварительная проверка CORS с SessionAuthenticationModule

  • Приложение My Cordova построено с помощью VS Tools для Apache Cordova и работает в Chrome через эмулятор Ripple. Проблема здесь в том, что эмулятор автоматически назначает порт, и я не могу найти способ его переопределить. Другими словами, если я могу изменить порт в соответствии с тем, который используется для моего веб-API, я могу временно ограничить ограничение CORS.
  • My Web API является CORS с поддержкой с помощью ссылки на System.Web.Http.Cors и следующий код запуска:

public static class WebApiConfig 
 
    { 
 
    public static void Register(HttpConfiguration config) 
 
    { 
 
     var cors = new EnableCorsAttribute("*", "*", "*"); // note: the '*' values are temporary for testing purposes 
 
     config.EnableCors(cors); 
 
    } 
 
    }

  • Мой клиент приложение выдавшего запрос предварительной проверки, так как мой тип содержимого требуется для приложения/json. Попытка добавить флаг withCredentials, установленный в true, не имеет эффекта - то есть мой токен-носитель никогда не отправляется во время запроса предполетной проверки.

  • Мой веб-интерфейс защищен с помощью Windows Identity Foundation. В частности, у меня есть пользовательский SessionAuthenticationModule, который проверяет каждый запрос независимо от того, связан ли он с CORS. У меня был ограниченный успех, пытаясь настроить модуль (ниже) таким образом, что я могу заставить его принять запрос перед полетом, но последующий POST из моего клиентского приложения никогда не отправляется. Должен ли я запускать эту логику асинхронно?

public class CustomSessionAuthenticationModule : SessionAuthenticationModule 
 
    { 
 
    private const string AccessControlRequestHeaders = "Access-Control-Request-Headers"; 
 
    private const string AccessControlAllowHeaders = "Access-Control-Allow-Headers"; 
 
    private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin"; 
 
    private const string Origin = "Origin"; 
 

 
    protected override void InitializeModule(HttpApplication context) 
 
    { 
 
     base.InitializeModule(context); 
 

 
     context.BeginRequest += ApplicationOnBeginRequest; 
 
    } 
 

 
    private static void ApplicationOnBeginRequest(object sender, EventArgs e) 
 
    { 
 
     var application = (HttpApplication)sender; 
 

 
     if (application.Request.Headers.AllKeys.Contains("Origin") && application.Request.HttpMethod == HttpMethod.Options.ToString()) 
 
     { 
 
     application.Response.StatusCode = (int)HttpStatusCode.OK; 
 
     application.Response.Headers.Add(AccessControlAllowOrigin, application.Request.Headers.GetValues(Origin).First()); 
 

 
     string requestedHeaders = string.Join(", ", application.Request.Headers.GetValues(AccessControlRequestHeaders)); 
 

 
     if (!string.IsNullOrEmpty(requestedHeaders)) 
 
     { 
 
      application.Response.Headers.Add(AccessControlAllowHeaders, requestedHeaders); 
 
     } 
 
     } 
 
    } 
 
    }

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

ответ

0

В интересах других, у кого может быть аналогичная проблема, я сделал некоторый прогресс с помощью обходного пути. Вот что я сделал:

  • Создал новое виртуальное приложение в IIS на том же сайте верхнего уровня, на котором размещен мой веб-API. Это новое приложение указывает на источник для моего приложения Cordova. Так как они находятся под одним и тем же сайтом и портом, запросы на предпросмотр CORS не выдаются.
  • Я также установил Ripple Emulator в Chrome, а затем нажал кнопку «Включить» на панели инструментов, выйдя из браузера на новый сайт и выбрав «Мобильный Интернет» в качестве платформы по умолчанию.

Update 8/12/15: недостающую часть добавляет следующую запись в раздел авторизации system.web в web.config:

<allow verbs="OPTIONS" users="*" /> 

Пока обычая падает SAM вернемся к базовому методу OnAuthenticateRequest для предполетных запросов, тогда все работает правильно.

Смежные вопросы