Запрос Cross Origin блокируется, когда http отправляет в .netcore 2.0 webapi из angular 6 - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь использовать аутентификацию Jwt для моего приложения angular 6.Несмотря на то, что я добавил промежуточное программное обеспечение cors в свой веб-интерфейс .netcore 2, я неоднократно получал эту ошибку, говоря:

"Запрос на перекрестное происхождение заблокирован: политика одинакового происхождения запрещает чтение удаленного ресурса на http://localhost:5000/api/auth/login. (Причина: запрос CORS не был выполнен). "

Angular6 http post:

angular6 http post

Индикация ошибки браузера cors:

Browser cors error indication

Промежуточное программное обеспечение Cors в .netcore2 webapi:

Cors middleware in .netcore2 webapi

http post-angular

export class LoginComponent {
  invalidLogin: boolean;

  constructor(private router: Router, private http: HttpClient) { }

  login(form: NgForm) {
    let credentials = JSON.stringify(form.value);
    this.http.post("http://localhost:5000/api/auth/login", credentials, {
      headers: new HttpHeaders({
        "Content-Type": "application/json"
      })
    }).subscribe(response => {
      let token = (<any>response).token;
      localStorage.setItem("jwt", token);
      this.invalidLogin = false;
      this.router.navigate([""]);
    }, err => {
      this.invalidLogin = true;
    });
  }
}

Cors middleware в файле Startup.cs

 public void ConfigureServices(IServiceCollection services)
            {
               services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                    .AddJwtBearer(options =>
                    {
                        options.TokenValidationParameters = new TokenValidationParameters
                        {
                            ValidateIssuer = true,
                            ValidateAudience = true,
                            ValidateLifetime = true,
                            ValidateIssuerSigningKey = true,

                            ValidIssuer = "http://localhost:5000",
                            ValidAudience = "http://localhost:5000",
                            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("superSecretKey@345"))
                        };
                    }); 

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

                 services.AddCors(cfg=>cfg.AddPolicy("ClientDomain",builder=>builder.WithOrigins("http://localhost:4200")));
            }


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

                app.UseHttpsRedirection();
                app.UseAuthentication();
                app.UseCors("ClientDomain");
                app.UseMvc();
            }
        }

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Все, что вам нужно сделать, это:

1) Установить пакет Microsoft.AspNetCore.Cors из nuget

2) Поместите код services.AddCors () в метод ConfigureServices () файла Startup.cs

3) Поставить код

app.UseCors (построитель => builder.WithOrigins ( "http://localhost:4200").AllowAnyMethod().AllowAnyHeader());

внутри метода Configure () файла Startup.cs перед перенаправлением http и аутентификацией, если таковые имеются.

0 голосов
/ 16 ноября 2018

Проблемы заключаются в том, что вы отправляете HTTP-запрос, но ваше промежуточное ПО Cors регистрируется поздно в конвейере и никогда не вызывается по HTTP-запросам из-за

app.UseHttpsRedirection();
app.UseAuthentication();

Другими словами: если ваш запрос находится на http, промежуточное программное обеспечение UseHttpsRedirection будет закорачивать конвейер и возвращать ответ без требуемых заголовков CORS во время предварительной проверки. То же самое относится, если вы делаете это через https, но пользователь не авторизован.

Чтобы разрешить CORS на http (или перед перенаправлением), а также для неавторизованных пользователей, вам необходимо зарегистрировать промежуточное программное обеспечение до строк выше

// now CORS is handled before https redirection & before authentication
app.UseCors("ClientDomain");
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseMvc();

Всегда помните, что промежуточное программное обеспечение вызывается в порядке их регистрации (UseXxx вызовы).

Общая информация. Когда вы получаете исключение для любого промежуточного программного обеспечения, оно будет CLEAR для заголовков. Следовательно, методы, генерирующие исключение, не будут содержать заголовки cors, даже если регистрация промежуточного программного обеспечения cors правильна

...