Поддержка Blazor и Webapi Cors

Я потратил дни, пытаясь понять это. Все примеры, которые я нашел, не работают или я чего-то не понимаю. У меня есть веб-интерфейс .netCore, который в настоящее время работает на https: // localhost: 5001, и автономная веб-сборка Blazor на https: // localhost: 5002. Из blazor я инициирую http-запрос:

protected async override void OnInitialized()
{
    base.OnInitialized();
    string reqUrl = $"https://localhost:5001/api/District/";
    var response = await http.GetAsync(reqUrl);
}

на webapi у меня есть файл startup.cs:

public class Startup
{
        public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        // For Entity Framework  
        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ConnStr")));

        // For Identity  
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        // Adding Authentication  
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        })

        // Adding Jwt Bearer  
            .AddJwtBearer(options =>
            {
                options.SaveToken = true;
                options.RequireHttpsMetadata = false;
                options.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidAudience = Configuration["JWT:ValidAudience"],
                    ValidIssuer = Configuration["JWT:ValidIssuer"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:Secret"]))
                };

            services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                                    builder =>
                                    {
                                        builder.WithOrigins("https://localhost:5002/");
                                    });
            });

        });
    }


// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();
        app.UseCors("CorsPolicy");

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

Я получаю эту ошибку при выполнении:

Доступ к выборке на https: // localhost: 5001 / api / District / 'from origin' https: // localhost: 5002 'заблокирован политикой CORS: заголовок' Access-Control-Allow-Origin 'отсутствует запрашиваемый ресурс. Если непрозрачный ответ соответствует вашим потребностям, установите для режима запроса значение «no-cors», чтобы получить ресурс с отключенным CORS.

Может ли кто-нибудь предложить изменение, чтобы эта работа работала? Я зашел в MS Docs, но это все равно что пытаться читать Коран на арабском ...


person John Baird    schedule 23.07.2020    source источник
comment
Попробуйте поставить app.UseCors("CorsPolicy"); перед app.UseAuthorization();.   -  person Rena    schedule 24.07.2020


Ответы (2)


Вызов UseCors должен быть размещен после UseRouting, но до UseAuthorization:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseCors("CorsPolicy");

    app.UseAuthorization();
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Ссылка:

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#cors-with-named-policy-and-middleware

person Rena    schedule 24.07.2020
comment
Я внес изменения в соответствии с вашим ответом, но в моем исходном сообщении все еще есть ошибки. Я могу ударить его от почтальона без ошибок - person John Baird; 24.07.2020
comment
Я тоже получаю сообщение об ошибке и все перепробовал - person Jed; 02.12.2020

Этот код работал у меня:

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddCors(options => options.AddPolicy(
              "_mypolicy", builder => builder
              .AllowAnyOrigin()
              .AllowAnyMethod()
              .AllowAnyHeader()
          )
           );
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseCors("_mypolicy");

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
person Jed    schedule 02.12.2020