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的主要内容,如果未能解决你的问题,请参考以下文章

CORS 不工作 ASP.Net MVC5

asp.net core mvc cors请求被拒绝[重复]

ASP.NET MVC 中不允许使用 POST 方法(使用 CORS)

尝试在 ASP.Net MVC 网站中启用 CORS 时出错

处理对 ASP.NET MVC 操作的 CORS 预检请求

在 ASP.NET 核心 MVC 项目上启用 CORS