ASP. NET Базовый API с Angular и Windows Auth - Preflight Requests - PullRequest
1 голос
/ 19 февраля 2020

Недавно мне было поручено создать внутренний веб-сайт компании с использованием 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 совсем не работает, если включена аутентификация при попытке доступа к данным с внешнего интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...