Я пытаюсь использовать аутентификацию Jwt в своем приложении angular 6. Хотя я добавил промежуточное ПО cors в свой .netcore 2 webapi, я постоянно получаю эту ошибку, говоря
"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5000/api/auth/login. (Reason: CORS request did not succeed)."
Angular6 http сообщение:

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

Промежуточное ПО Cors в .netcore2 webapi:

http пост угловой
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 в файле 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();
}
}





Проблемы, похоже, заключаются в том, что вы отправляете 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).
Интересный факт: когда вы получаете исключение для любого промежуточного программного обеспечения, промежуточное программное обеспечение исключения будет ЧИСТЫЙ заголовков. Следовательно, методы, которые генерируют исключение, не будут содержать заголовки cors, даже если регистрация промежуточного программного обеспечения cors верна.
+1. To OP: если отправить сообщение на http://localhost:5001/api/auth/login",, я получаю что-то вроде Connection id "0HLIBJHR3T2L6" bad request data: "Invalid request line: '\x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03n'\xA3N\x0D\xA1\xB3(\x8E\xBA\xB0b\xCDla\x0A'" Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Invalid request line: '\x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03n'\xA3N\x0D\xA1\xB3(\x8E\xBA\xB0b\xCDla\x0A'. Если изменить конечную точку на https://localhost:5001/api/auth/login, она будет работать нормально. Но, прежде всего, мы должны сначала разрешить Content-Type
Хотя я зарегистрировал промежуточное ПО CORS до перенаправления и аутентификации http, проблема все еще существует. Выдает ту же ошибку, что и раньше
Все, что вам нужно сделать, это:
1) Установите пакет Microsoft.AspNetCore.Cors из nuget
2) Поместите код services.AddCors () в метод ConfigureServices () файла Startup.cs.
3) Ставим код
app.UseCors (builder => builder.WithOrigins ("http: // локальный: 4200"). AllowAnyMethod (). AllowAnyHeader ());
внутри метода Configure () файла Startup.cs перед перенаправлением http и аутентификацией, если таковая имеется.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowAll", p =>
{
p.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors("AllowAll");
}
Пожалуйста, не размещайте изображения кода, добавьте в вопрос код с форматированием кода. (Вы можете вставить его в редактор, выбрать его и затем нажать кнопку «Код»)