Access-control-allow-origin с несколькими доменами

В моем web.config я хотел бы указать несколько доменов для директивы access-control-allow-origin. Я не хочу использовать *. Я пробовал этот синтаксис:

 

вот этот

  

вот этот

  

и этот

   

но никто из них не работает. Каков правильный синтаксис?

Может быть только один заголовок ответа Access-Control-Allow-Origin , и этот заголовок может иметь только одно исходное значение. Поэтому, чтобы заставить это работать, вам необходимо иметь код:

  1. Захватывает заголовок запроса Origin .
  2. Проверяет, является ли значение начала одним из значений белого списка.
  3. Если он действителен, задает заголовок Access-Control-Allow-Origin с этим значением.

Я не думаю, что это можно сделать только через web.config.

 if (ValidateRequest()) { Response.Headers.Remove("Access-Control-Allow-Origin"); Response.AddHeader("Access-Control-Allow-Origin", Request.UrlReferrer.GetLeftPart(UriPartial.Authority)); Response.Headers.Remove("Access-Control-Allow-Credentials"); Response.AddHeader("Access-Control-Allow-Credentials", "true"); Response.Headers.Remove("Access-Control-Allow-Methods"); Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); } 

Для IIS 7.5+ и Rewrite 2.0 вы можете использовать:

                     

Объяснение переменной сервера RESPONSE_Access_Control_Allow_Origin :
В Rewrite вы можете использовать любую строку после RESPONSE_ и она будет создавать заголовок ответа, используя остальную часть слова в качестве имени заголовка (в этом случае Access-Control-Allow-Origin). Rewrite использует символы подчеркивания «_» вместо тире «-» (переписать их в тире)

Объяснение переменной сервера HTTP_ORIGIN :
Аналогично, в Rewrite вы можете захватить любой заголовок запроса, используя HTTP_ в качестве префикса. Те же правила с тире (используйте символы подчеркивания «_» вместо тире «-»).

В Web.API этот атрибут можно добавить с помощью Microsoft.AspNet.WebApi.Cors как описано в http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web- апи

В MVC вы можете создать атрибут фильтра для выполнения этой работы для вас:

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class EnableCorsAttribute : FilterAttribute, IActionFilter { private const string IncomingOriginHeader = "Origin"; private const string OutgoingOriginHeader = "Access-Control-Allow-Origin"; private const string OutgoingMethodsHeader = "Access-Control-Allow-Methods"; private const string OutgoingAgeHeader = "Access-Control-Max-Age"; public void OnActionExecuted(ActionExecutedContext filterContext) { // Do nothing } public void OnActionExecuting(ActionExecutingContext filterContext) { var isLocal = filterContext.HttpContext.Request.IsLocal; var originHeader = filterContext.HttpContext.Request.Headers.Get(IncomingOriginHeader); var response = filterContext.HttpContext.Response; if (!String.IsNullOrWhiteSpace(originHeader) && (isLocal || IsAllowedOrigin(originHeader))) { response.AddHeader(OutgoingOriginHeader, originHeader); response.AddHeader(OutgoingMethodsHeader, "GET,POST,OPTIONS"); response.AddHeader(OutgoingAgeHeader, "3600"); } } protected bool IsAllowedOrigin(string origin) { // ** replace with your own logic to check the origin header return true; } } 

Затем либо включите его для определенных действий / controllerов:

 [EnableCors] public class SecurityController : Controller { // *snip* [EnableCors] public ActionResult SignIn(Guid key, string email, string password) { 

Или добавьте его для всех controllerов в Global.asax.cs

 protected void Application_Start() { // *Snip* any existing code // Register global filter GlobalFilters.Filters.Add(new EnableCorsAttribute()); RegisterGlobalFilters(GlobalFilters.Filters); // *snip* existing code } 

Прочитав каждый ответ и попробовав их, никто из них не помог мне. То, что я нашел во время поиска в другом месте, заключается в том, что вы можете создать настраиваемый атрибут, который затем добавить в свой controller. Он перезаписывает EnableCors и добавляет в него белые списки.

Это решение работает хорошо, потому что оно позволяет вам иметь белые списки в webconfig (appsettings) вместо того, чтобы их кодировать в атрибуте EnableCors на вашем controllerе.

  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] public class EnableCorsByAppSettingAttribute : Attribute, ICorsPolicyProvider { const string defaultKey = "whiteListDomainCors"; private readonly string rawOrigins; private CorsPolicy corsPolicy; ///  /// By default uses "cors:AllowedOrigins" AppSetting key ///  public EnableCorsByAppSettingAttribute() : this(defaultKey) // Use default AppSetting key { } ///  /// Enables Cross Origin ///  /// AppSetting key that defines valid origins public EnableCorsByAppSettingAttribute(string appSettingKey) { // Collect comma separated origins this.rawOrigins = AppSettings.whiteListDomainCors; this.BuildCorsPolicy(); } ///  /// Build Cors policy ///  private void BuildCorsPolicy() { bool allowAnyHeader = String.IsNullOrEmpty(this.Headers) || this.Headers == "*"; bool allowAnyMethod = String.IsNullOrEmpty(this.Methods) || this.Methods == "*"; this.corsPolicy = new CorsPolicy { AllowAnyHeader = allowAnyHeader, AllowAnyMethod = allowAnyMethod, }; // Add origins from app setting value this.corsPolicy.Origins.AddCommaSeperatedValues(this.rawOrigins); this.corsPolicy.Headers.AddCommaSeperatedValues(this.Headers); this.corsPolicy.Methods.AddCommaSeperatedValues(this.Methods); } public string Headers { get; set; } public string Methods { get; set; } public Task GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken) { return Task.FromResult(this.corsPolicy); } } internal static class CollectionExtensions { public static void AddCommaSeperatedValues(this ICollection current, string raw) { if (current == null) { return; } var paths = new List(AppSettings.whiteListDomainCors.Split(new char[] { ',' })); foreach (var value in paths) { current.Add(value); } } } 

Я нашел это руководство онлайн, и он работал как шарм:

http://jnye.co/Posts/2032/dynamic-cors-origins-from-appsettings-using-web-api-2-2-cross-origin-support

Я думал, что брошу это здесь для всех, кто в этом нуждается.

Загляните в библиотеку IdentityType IdentityModel – она ​​имеет полную поддержку CORS:

http://brockallen.com/2012/06/28/cors-support-in-webapi-mvc-and-iis-with-thinktecture-identitymodel/

И он может динамически излучать ACA-Origin, который вы хотите.

Мне удалось решить эту проблему в коде обработки запроса, следуя советам «monsur».

 string origin = WebOperationContext.Current.IncomingRequest.Headers.Get("Origin"); WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", origin); 

Вы можете использовать среднюю программу owin для определения политики cors, в которой вы можете определить несколько корсовых происхождений

 return new CorsOptions { PolicyProvider = new CorsPolicyProvider { PolicyResolver = context => { var policy = new CorsPolicy() { AllowAnyOrigin = false, AllowAnyMethod = true, AllowAnyHeader = true, SupportsCredentials = true }; policy.Origins.Add("http://foo.com"); policy.Origins.Add("http://bar.com"); return Task.FromResult(policy); } } }; 

Вам нужно только: – добавить Global.asax к вашему проекту,
– удалить из вашего web.config.
– после добавления в Application_BeginRequest метода Global.asax это:

 HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin","*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,PUT,DELETE"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept"); HttpContext.Current.Response.End(); } 

Надеюсь, эта помощь. которые работают для меня.

  • Настройка нескольких параметров SMTP в web.config?
  • Шифрование строки подключения в web.config
  • Ошибка входа для пользователя «NT AUTHORITY \ NETWORK SERVICE»
  • Указанный аргумент вышел за пределы допустимых значений. Имя параметра: сайт
  • Преобразование Web.config работает локально
  • Цитата Escape в строке подключения web.config
  • Для чего нужны файлы Web.Debug.config и Web.Release.Config?
  • Добавить пользовательский заголовок на основе типа файла
  • Вложенное приложение ASP.NET в IIS, наследующее родительские настройки конфигурации?
  • Ошибка использования раздела, зарегистрированного как allowDefinition = 'MachineToApplication', превышающего уровень приложения
  • Ограничить доступ к определенному controllerу по IP-адресу в бета-версии ASP.NET MVC
  • Давайте будем гением компьютера.