【问题标题】:Cannot get CORS to work in Visual Studio (works on DEV pair of servers, won’t work on TEST pair of servers)无法让 CORS 在 Visual Studio 中工作(在 DEV 对服务器上工作,在 TEST 对服务器上工作)
【发布时间】:2020-03-30 04:03:29
【问题描述】:

我们有拆分服务器 - WEBAPI 在单独的服务器上。我让我的应用程序在 DEV 中的拆分服务器上运行,但我已将相同的代码移动到这对 TEST 服务器上,但它无法正常工作。我不知道为什么。似乎它与 TEST WebApi 服务器肯定有所不同,但我不知道在哪里查看,也无法访问它来查看引擎盖下而不要求系统人员为我做这件事。

使用的软件:Visual Studio 2017、C#、Javascript、HTML/CSS、Oracle、Entity Framework 6、Breeze、IIS 10

我安装了 NuGet 包:Microsoft.AspNet.WebApi.Cors 5.2.7 和 Microsoft.AspNetCore.Mvc.Cors 2.2.0。

在我的 \WebAPI\App_Start\WebApiConfig.cs 中,我添加了 EnableCors:

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services
    config.EnableCors();

    // Web API routes
    config.MapHttpAttributeRoutes();

在我的 BREEZE 和 MVC 控制器中,我为 DEV、TEST 和 PREPROD 环境添加了具有 3 个来源的 EnableCors(我确实发现 [Authorize] 属性的存在导致它不起作用。不得不评论一下出):

using System.Web.Http.Cors;

namespace SCC.WebAPI.Controllers
{
    //[Authorize]    
    [BreezeController]
    [EnableCors(origins: “http://webdevint.scc.state.va.us,http://in.scctest2new.scc.state.va.us,http://in.sccpreweb5.scc.state.va.us", headers: "*", methods: "*")]
    public class LookupController : ApiController
    {

DEV 工作正常,TEST 不工作。

在 DEV 上 - 我得到了 CORS 所需的 Access-Control-Allow-Origin 标头:

来源(在我的 EnableCors 中):WEBDEVINT 服务器 --> Webapi:SCCDEVCS 服务器

在测试中 - 我收到一个错误:

来源(在我的 EnableCors 中):SCCTEST2NEW 服务器 --> Webapi:SCCTESTAPP 服务器

ERROR: “Access to XMLHttpRequest at 'http://scctestapp.scc.state.va.us/EFIWEBAPI/breeze/Lookup/Metadata' from origin 'http://in.scctest2new.scc.state.va.us' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.”

如果我输入它试图访问地址栏的 URL:'http://scctestapp.scc.state.va.us/EFIWEBAPI/breeze/Lookup/Metadata',

它工作得很好。返回元数据。所以我知道请求的 URL 是正确的。

注意:我还在我的控制器中尝试了以下操作,但没有任何不同 - 我知道允许任何服务器发起消息都有一点安全风险:

[EnableCors(origins: "*", headers: "*", methods: "*")]

TEST 服务器与 DEV 服务器似乎有些不同。但是我在 IIS 中设置了两个 webapp(UI 和 WebAPI),在 DEV 和 TEST 上设置的方式完全相同。

会不会是需要设置的 IIS 设置?会不会是 GAC 中的某事?我不知道从哪里开始寻找。感谢您的建议。

编辑: 我还尝试在 WebAPI web.config 中添加和不包含 Credentials 行的以下行:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="http://in.scctest2new.scc.state.va.us" />
        <add name="Access-Control-Allow-Headers" value="*" />
        <add name="Access-Control-Allow-Methods" value="*" />
        <add name="Access-Control-Allow-Credentials" value="true" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

但它在元数据调用上给了我一个 401 Unauthorized。不确定它在寻找什么凭据。

【问题讨论】:

    标签: javascript asp.net-mvc controller cors webapi


    【解决方案1】:

    在 Startup.cs 中设置类似的东西

      app.Use(async (context, next) =>
                {
                    //context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
                    await next.Invoke();
                });
                app.UseCors(
                  options => options.WithOrigins("http://117.1.16.24",
                                "http://10.47.102.60",
                                "http://10.47.102.61",
                                "http://10.47.102.62",
                                "http://10.47.102.63")
                              .AllowAnyOrigin()
                              .AllowAnyHeader()
                              .AllowAnyMethod()
                              .AllowCredentials()
                );
    

    【讨论】:

    • 我不知道该怎么办。我没有 Startup.cs。我通过添加这些行在 WebAPI web.config 中尝试了类似的东西:
    • in.scctest2new.scc.state.va.us" /> " /> 但是当元数据尝试运行时,这会给我一个 401 Unauthorized 。不确定它在寻找什么凭据。此外,我不需要它来成功地在 DEV 服务器上工作。
    • 我刚刚在对原始问题的编辑中添加了上述代码,因此更具可读性。
    • 您使用的是 .Net Core 吗?还是 .Net 框架?
    • 您是否尝试将 [EnableCors(origins: "", headers: "", methods: "*")] 放在控制器中的单个函数之上
    【解决方案2】:

    这里是控制器类的代码

    [EnableCors(origins: "*", headers: "*", methods: "*")]
        public class LienThongController : ApiController
    

    还有功能

     [EnableCors(origins: "*", headers: "*", methods: "*")]
            [HttpGet]
            [Route("Unit/getList")]
            public IHttpActionResult getListUnitLienThong()
    

    Web API 配置

     public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // Web API configuration and services
                config.EnableCors(); 
                // Web API routes
                config.MapHttpAttributeRoutes();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            }
        }
    

    【讨论】:

    • 这对模拟问题没有帮助,是吗?如果我打开 IIS 匿名身份验证,我发现我的 CORS 代码正在工作。但这会导致我的模拟(需要使代码能够将 XML 文件写入文件共享)停止工作。所以我想弄清楚如何模拟以使用匿名身份验证。
    • 因此,确保 [Authorize] 属性已被注释掉并确保 IIS 匿名身份验证已打开,从而使 CORS 最终工作。
    • 现在我的问题是让模拟恢复工作。除非您有一些想法,否则我可能应该为此开一张新票。我在想可能会推出一个新的 IIS 应用程序池,使用我自己的 id 和密码作为匿名用户,因此可以打开匿名以使 CORS 工作,但用户是我需要模拟的用户。
    • 不只是将 Authorize 标签声明为您想让 Authorize 工作的功能,如下所示: [Authorize] [HttpGet] [Route("Unit/getList")] public IHttpActionResult getListUnitLienThong() 和某些功能不是使用 Authorize [HttpGet] [Route("Unit/getAgenciesList")] public IHttpActionResult getAgenciesList() 不要将 Authorize 标签推送到类控制器是使类 Authorize 中的所有功能
    • 如果您需要检查您的代码,可以与我联系 vietdq1291@gmail.com
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多