CORS:使用 ASP.NET 4.5.1 MVC 的 Rest API
Posted
技术标签:
【中文标题】CORS:使用 ASP.NET 4.5.1 MVC 的 Rest API【英文标题】:CORS: Rest API with ASP.NET 4.5.1 MVC 【发布时间】:2016-07-24 01:17:39 【问题描述】:我的应用程序允许跨站点脚本时遇到问题。当我尝试执行 POST 时,GET 请求工作正常:
XMLHttpRequest cannot load http://localhost:49187/api/CampaignRegistration. The request was redirected to 'http://localhost:49187/Authentication/UnAuthorized?ReturnUrl=%2Fapi%2FCampaignRegistration', which is disallowed for cross-origin requests that require preflight.
我的预检请求返回 200 OK(没有身份验证标头),但我的实际请求返回 302 Not Found(其中包含我的身份验证标头)。
我的预检请求如下所示:
Access-Control-Request-Headers:accept, content-type
Access-Control-Request-Method:POST
响应是:
Access-Control-Allow-Headers:content-type
Access-Control-Allow-Origin:*
我的请求有效负载标头是:
Cache-Control: "no-cache", Authorization: "Basic XXXXX"
我已经像这样在我的 WebApiConfig.cs 中启用了 CORS(我将更改原点:* 当它实际工作时)。我在 web.config 中删除了与 CORS 相关的所有内容。
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
我的 WebApi 控制器都扩展了一个 BasicApiController,其中包括一个自定义身份验证属性,如下所示:
protected override bool IsAuthorized(HttpActionContext actionContext)
try
if (HttpContext.Current.Request.Headers.AllKeys.Contains("Authorization"))
string authHeader = HttpContext.Current.Request.Headers["Authorization"];
string cred =
Encoding.UTF8.GetString(Convert.FromBase64String(authHeader.Substring("Basic ".Length)));
string[] parts = cred.Split(':');
string userName = parts[0];
string password = parts[1];
if (userName == _configRepository.WebApiUsername && password == _configRepository.WebApiPassword)
return true;
return false;
catch (Exception ex)
return false;
我的前端是使用backbone.js 制作的,但我真的不认为问题出在前端。我曾尝试更改 web.config 无济于事,从我收集到的内容中,在启用 CORS 之后,我不需要任何东西。我尝试绕过 OPTIONS 方法的身份验证,因为我的应用程序不使用 OPTIONS(预检请求之外),但正如预期的那样,即使没有身份验证标头,预检请求也没有问题。如果有人有任何想法,将不胜感激!
【问题讨论】:
【参考方案1】:似乎问题出在客户端。授权参数在有效负载中而不是在标头中.... /facepalm.
【讨论】:
以上是关于CORS:使用 ASP.NET 4.5.1 MVC 的 Rest API的主要内容,如果未能解决你的问题,请参考以下文章
asp.net core mvc cors请求被拒绝[重复]
ASP.NET MVC 中不允许使用 POST 方法(使用 CORS)