在Asp.net Web API中处理CORS预检

我的架构中有三个应用程序。
它们位于同一台服务器上,但具有不同的端口号。

A - Token Application (port 4444) - Asp.net WebApi B - API Application (port 3333) - Asp.net WebApi C - UI Application (port 2222) - AngularJS App. 

申请流程如下

1- UI项目从令牌应用程序获取令牌(它需要Windows awxrsdsaWeffs12davalidation。)例如: awxrsdsaWeffs12da

2- UI应用程序将此标记放入自定义标头,该标头名为“accessToken”

例如:accessToken: awxrsdsaWeffs12da

3- UI应用程序向API Application Ex发送请求: http:myaddress:3333/api/TheRestServiceHere

UI应用程序获得401错误。 哪个发送OPTIONS方法。 (我想预检问题)

在我的web api项目中,我启用了如下所示的Cors。

 public static void Register(HttpConfiguration config) { .... //CORS var cors = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(cors); .... } 

配置

  public static class WebApiConfig { public static void Register(HttpConfiguration config) { //CORS var cors = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(); // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None; json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; json.SerializerSettings.Formatting = Formatting.None; json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); config.Formatters.Remove(config.Formatters.XmlFormatter); } } 

所以我正在寻找一个解决方案来调用API应用程序(B)控制器并得到200 🙂

问候

我通过创建一个响应使用OPTIONS动词的请求的模块来修复我正在处理的应用程序。 您可能应该稍微修改它以包含应用程序请求的动词和内容类型。 在我的情况下,我决定将所有内容发布为JSON(需要进行飞行前检查)。 该模块如下:

 public class OptionsModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += (sender, args) => { var app = (HttpApplication) sender; if (app.Request.HttpMethod == "OPTIONS") { app.Response.StatusCode = 200; app.Response.AddHeader("Access-Control-Allow-Headers", "content-type"); app.Response.AddHeader("Access-Control-Allow-Origin", APISettings.ApplicationOrigin); app.Response.AddHeader("Access-Control-Allow-Credentials", "true"); app.Response.AddHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS"); app.Response.AddHeader("Content-Type", "application/json"); app.Response.End(); } }; } public void Dispose() { } } 

然后你需要在你的web.config中注册它:

      

您可能想要做的另一件事是明确指定允许的原点。 Chrome不喜欢那里有通配符。

我的一位朋友使用OPTIONSVerbHandler解决了这个问题。

当UI应用程序想要使用GET方法时,浏览器首先将OPTION方法发送到服务器(Preflight)。 然后,如果Preflight请求正常,则发送GET请求。

选项请求 - 预先获得请求 - 预检后

对于CORS测试目的,我们使用以下代码发送GET方法。

     

要处理在GET之前通过浏览器发送的OPTION方法,您应该进行以下设置。 在此处输入图像描述

1- Webconfig

      

2-使用以下设置添加OPTIONSVerbHandler

在此处输入图像描述

点击请求限制 在此处输入图像描述

在此处输入图像描述在此处输入图像描述

3-我们的标题设置我们有accessToken ,您可以看到自定义

在此处输入图像描述

对于Azure环境

您需要来自门户网站的允许来源。

Azure Cors设置