CORS в .NET Core

Я пытаюсь включить публичную конфигурацию IConfigurationRoot { get ; } public void ConfigureServices ( службы IServiceCollection ) { services . AddCors ( options => options . AddPolicy ( «AllowAll» , p => p . AllowAnyOrigin () . AllowAnyMethod () . AllowAnyHeader ())); услуг . AddMvc (); } public void Configure ( приложение IApplicationBuilder ) { приложение . UseCors ( «AllowAll» ); приложение . UseMvc ( маршруты => { маршруты . MapRoute ( название : " по умолчанию" , шаблон : "? {Контроллер = Главная} / {действие = Index} / {ID}" ); }); } } следующим образом:

        var host = new WebHostBuilder()
            .UseWebListener()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            //.UseWebListener(options => options.Listener.AuthenticationManager.AuthenticationSchemes = AuthenticationSchemes.NTLM)
            .Build();

Однако, когда я отправляю запрос в мое приложение с Angular 2, я получаю знаменитый

Заголовок «Нет» Access-Control-Allow-Origin присутствует на запрошенном ресурсе ».

сообщение об ошибке.

Я также использую Windows Authentication + WebListener. Если я проверяю почтальон, единственными заголовками ответов являются:

Content-Length> 3533 Content-Type> application / json; charset = utf-8 Дата> Пт, 14 Окт 2016 12:17:57 GMT Сервер> Microsoft-HTTPAPI / 2.0

Поэтому должно быть что-то неправильное настроено. Любые предложения?

Если я удаляю outcommented line, это работает, но мне нужна аутентификация Windows :-(

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Cors.Infrastructure;

namespace NetCoreWebApiTesting
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

            if (env.IsEnvironment("Development"))
            {
                // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
                builder.AddApplicationInsightsSettings(developerMode: true);
            }

            builder.AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public IConfigurationRoot Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container
        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddApplicationInsightsTelemetry(Configuration);

            services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling =
                                                            Newtonsoft.Json.ReferenceLoopHandling.Ignore);

            // ********************
            // Setup CORS
            // ********************
            var corsBuilder = new CorsPolicyBuilder();
            corsBuilder.AllowAnyHeader();
            corsBuilder.AllowAnyMethod();
            corsBuilder.AllowAnyOrigin(); // For anyone access.
            //corsBuilder.WithOrigins("http://localhost:56573"); // for a specific url. Don't add a forward slash on the end!
            corsBuilder.AllowCredentials();

            services.AddCors(options =>
            {
                options.AddPolicy("SiteCorsPolicy", corsBuilder.Build());
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            app.UseApplicationInsightsRequestTelemetry();

            app.UseApplicationInsightsExceptionTelemetry();

            app.UseMvc();

            // ********************
            // USE CORS - might not be required.
            // ********************
            app.UseCors("SiteCorsPolicy");
        }
    }
}

c#,web,cors,.net-core,

26

Ответов: 5


Предположим, что у вас есть ответ, но в интересах поисковиков у меня была такая же проблема со стандартным руководством по .NET Core Cors .

Одна из многих ошибок:

XMLHttpRequest не может загрузить localhost: 64633 / api / blogs. Ответ на запрос перед полетом не проходит проверку контроля доступа. Нет заголовка «Access-Control-Allow-Origin» на запрошенном ресурсе. Происхождение localhost: 56573 ', следовательно, не допускается. В ответе был код статуса HTTP 500.

После игры работал следующий код. Полный класс опубликован ниже, чтобы понять, что происходит.

EnableCorsAttribute

Чтобы использовать его, вы можете добавить либо на контроллер, либо на метод. например[EnableCors("SiteCorsPolicy")] [Route("api/[controller]")] public class BlogsController : Controller { }

// POST api/value
[EnableCors("SiteCorsPolicy")]
[HttpPost]
public HttpResponseMessage Post([FromBody]Blog value)
{
    // Do something with the blog here....

    var msg = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
    return msg;

}

или

function HandleClick() {

    var entityData = {
        "blogId": 2,
        "url": "http://blog.com/blog1",
        "posts": [
        {
            "postId": 3,
            "title": "Post 1-1",
            "content": "This is post 1 for blog 1",
            "blogId": 2
        },
        {
            "postId": 4,
            "title": "Post 1-2",
            "content": "This is post 2 for blog 1",
            "blogId": 2
        }
        ]
    };

    $.ajax({
        type: "POST",
        url: "http://localhost:64633/api/blogs",
        async: true,
        cache: false,
        crossDomain: true,
        data: JSON.stringify(entityData),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (responseData, textStatus, jqXHR) {
            var value = responseData;
        },
        error: function (responseData, textStatus, errorThrown) {
            alert('POST failed.');
        }
    });
}

Когда я вызвал это, используя следующий код (используя стандартный js / jQuery для простого копирования и вставки), связь перестала быть отклонена.

public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options => options.AddPolicy("AllowAll", p => p.AllowAnyOrigin()
                                                                    .AllowAnyMethod()
                                                                     .AllowAnyHeader()));     
        services.AddMvc();            
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseCors("AllowAll");

        app.UseMvc(routes =>
         {
             routes.MapRoute(
                 name: "default",
                 template: "{controller=Home}/{action=Index}/{id?}");
         });

    }

17

Этот способ работает нормально, просто попробовал его на угловом2 с ядром .net. Проблема с OP заключается в том, что это не работает с проверкой подлинности Windows. Я предполагаю, что промежуточное программное обеспечение для проверки подлинности Windows происходит до того, как прозвучит запрос, и в этом случае его нарушение. Лучшая ставка будет заключаться в том, чтобы увидеть, есть ли способ включить промежуточное программное обеспечение windows auth после того, как промежуточное программное обеспечение cors обработало в Configure.

Тогда заказ будет

App.UseCors ()

App.UseWindowsAuth ()

App.UseMVC ()

Они должны произойти в этом порядке, чтобы он работал.

app.UseCors(b => b.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials());

9

Что недостает документации, так это важность .AllowAnyMethod (). Если этого не происходит, страшный No 'Access-Control-Allow-Origin' будет продолжать прослушивать вас. В вашем коде он есть, поэтому, я думаю, вы пропустили настройку правого заголовка в приложении jour client side.

Я лично получил его для работы, разрешив все:

post(model) {

    let headers = new Headers({
      'Content-Type':'application/json; charset=utf-8;' 
      ,'Accept':'*/*'
    });


    let options = new RequestOptions({ headers: headers });
    let body = JSON.stringify(model);

    return this.http.post(
      'http://localhost:58847/api/TestPost', body, options)
      .map((response: Response) => {
        let res = response.json();
        return res;
      }
    );
}

И моя функция «Угловая почта» вроде:

   public void ConfigureServices(IServiceCollection services)
    {

        services.Configure<MvcOptions>(options =>
        {
            options.Filters.Add(new CorsAuthorizationFilterFactory("AllowSpecificOrigin"));
        });
        services.AddCors(options =>
        {
            options.AddPolicy("AllowSpecificOrigin",
                builder => builder.WithOrigins("http://localhost:5000").AllowAnyHeader()
                .AllowAnyMethod());
        });

        services.AddMvc()
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

        loggerFactory.AddConsole();
        loggerFactory.AddDebug(LogLevel.Information);

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        // Shows UseCors with named policy.
        app.UseCors("AllowSpecificOrigin");

        app.UseStaticFiles();
        app.UseAuthentication();


        app.UseMvcWithDefaultRoute();
    }
}

После этого вы постепенно прокладываете себе путь, указав происхождение и т. Д.


4

В ASPNET CORE 2.0 для меня работает следующее

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    //Or if you want to chose what to include
    services.AddMvcCore()
            .AddCors()
            (...)
}


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    //Cors
    app.UseCors(builder =>
    {
        builder.AllowAnyHeader();
        builder.AllowAnyMethod();
        builder.AllowCredentials();
        builder.AllowAnyOrigin(); // For anyone access.
        //corsBuilder.WithOrigins("http://localhost:56573"); // for a specific url.
     });
}

2

Ответ @HockeyJ прав, но вы можете сделать что-то более сжатое, если захотите.

C #, веб, CORS, .net-жильный,