Недавно мне было поручено создать внутренний веб-сайт компании с использованием ASP. NET Core 3.0 API и Angular 8.
Для авторизации пользователей я настроил вверх по проекту API с аутентификацией Windows и включил это в Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddCors(options =>
{
options.AddPolicy("FrontEndPolicy",
builder => builder.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DevConnection")));
AddScopedServices(services);
}
// 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.UseCors("FrontEndPolicy");
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Я протестировал API-вызовы Basi c в Postman, и он работал нормально, поэтому я настроил CORS, Создал Angular проект и продолжил там. Создан Interceptor, который добавляет учетные данные к моим запросам:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
req = req.clone({
withCredentials: true,
});
return next.handle(req);
}
, а затем выполнил простой метод GET (возвращает текущего пользователя):
getUser() {
return this.http.get
(environment.apiUrlCoreUserHttp,
{ observe: 'response' });}
Это работает очень хорошо и возвращает нужные данные ( username):
Тест метода GET
Доволен результатом Я решил протестировать метод POST, поэтому снова создал простой метод, который должен просто возвращать сообщение в консоль:
Проект API:
[HttpPost]
[Route("{siteName}/post")]
public ActionResult<string> PostForm()
{
return User.Identity.Name == null ? $"Posted data as Anonymous user" : $"Posted data as {User.Identity.Name}";
}
В Angular:
post() {
var body = {};
return this.http.post(environment.apiUrlCoreHttp + "dynamicsites/cheesestore/post",
body,
{responseType: 'text'}).subscribe(res => console.log(JSON.stringify(res)));}
Однако код состояния ответа 401:
Ответ Значение
Заголовки POST
Я предполагаю, что при наличии ошибки возникла проблема с запросом Preflight в заголовках ответа. Затем я решил протестировать метод post без включенной аутентификации, и результат был положительным, и я снова получил необходимые данные в консоли:
Заголовки POST без Auth
I Предположим, что причина, по которой у меня возникает ошибка с включенной аутентификацией, заключается в отсутствии определенных заголовков ответа в запросе предварительной проверки параметров, а именно:
Access-Control-Allow-Headers: тип содержимого Access-Control-Allow-Methods : POST Access-Control-Allow-Origin: http://localhost: 4200
, которые отсутствовали в предыдущем запросе. Я пытался найти подходящее решение, но безуспешно. Кто-нибудь сталкивался с проблемой Windows Аутентификация / сценарий CORS? Я должен признать, что это ужасно расплывчато, потому что GET работает просто отлично, а POST совсем не работает, если включена аутентификация при попытке доступа к данным с внешнего интерфейса.