首页 > 解决方案 > 405 方法不允许在 ASP.NET 5 WebApi OPTIONS 预检

问题描述

我正在尝试在我的应用程序中集成 CORS 策略。为此,我需要使用两个策略,因此我按照使用属性启用 CORS 的说明进行了以下操作。作为记录,我将 CORS 配置包装在一个扩展中,并从配置中加载列入白名单的端点。

    public static IServiceCollection ConfigureCors(this IServiceCollection serviceCollection,
        IConfiguration configuration)
    {
        return serviceCollection
                .AddCors(cors => cors.AddPolicy(CORS_POLICY_STRICT, policy =>
                    policy
                        .WithOrigins()
                        .WithMethods("POST")
                        .WithHeaders("Authorization")
                ))
                .AddCors(cors =>
                    cors.AddPolicy(CORS_POLICY_FE_API, policy =>
                        policy
                            .AllowAnyMethod()
                            .AllowAnyHeader()
                            .WithOrigins(GetFrontEndOrigins(configuration))
                    ))
            ;
    }


    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {

           app
            .UseHttpsRedirection()
            .UseRouting()
            .UseCors()
            .UseAuthentication()
            .UseAuthorization()
            .UseEndpoints(endpoints => { endpoints.MapControllers(); })
            ;
    }


    public void ConfigureServices(IServiceCollection services)
    {
        services
            .ConfigureCors(Configuration)
            .AddControllers()
            ;
    }

CORS_POLICY_STRICT应该是 BE-2-BE 调用的策略,而CORS_POLICY_FE_API必须登记 localhost 和 prod+dev FE 微服务 URL。

[EnableCors(<POLICY_NAME_CONST>)]我在适当的地方注释了控制器。

我的问题是应用程序启动时没有错误,Swagger 可以工作,但我什至无法在 cUrl/PowerShell 中运行预检请求,也不能从部署在另一个端口(通常为 4200)的 localhost 上的 Angular 应用程序调用代码。

获取任何带有注释的 API URLEnableCorsAttribute

> Invoke-RestMethod -Method Options -Uri "https://localhost:5001/api/v1/secure/SomeController/someMethod" -Headers @{"Access-Control-Request-Method"="POST";"Access-Control-Request-Headers"="X-Requested-With"}

$ curl -X OPTIONS "https://localhost:5001/api/v1/secure/SomeController/someMethod" -i   

两者都返回 405 Method Not Allowed

那有什么问题?

我还尝试将简单UseCors()调用替换为两个调用,UseCors(string)每个调用使用一个策略键。只有策略名称是参数,因为我将从服务配置策略。

标签: corsasp.net-core-webapi.net-5

解决方案


最终它起作用了,因为我已将不需要的空间配置http://localhost :4200为允许的来源之一


推荐阅读