Angular 4 HTTP POST с проблем с удостоверяване на Windows преди полет

Използвам angular 4 с ASP.NET web api 2 на бекенда с активирано удостоверяване на Windows. Имам една публикация и един get api. GET работи добре. Но за POST получавам тази грешка

Отговорът за предварителна проверка има невалиден HTTP код за състояние 401

Което означава, че получавам неупълномощена грешка за метода OPTIONS, което знам, че не трябва да е така, защото методът OPTIONS никога не се извиква с потребителски идентификационни данни.

в angular извиквам api по следния начин

      let requestOptions = new RequestOptions({
      withCredentials: true,
      headers: new Headers({
        'content-type': 'application/json'
      })
    })
    this.http.post("someapiendpoint", JSON.stringify(data), requestOptions).subscribe(data => {
      debugger;
    });

Зададох всички заглавки на CORS в моята уеб конфигурация, както следва

        <add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/>
        <add name="Access-Control-Allow-Origin" value="http://localhost:4200" />
        <add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true" />

Също така имам следното в моя блок за удостоверяване на web.config

             <authentication>

                <anonymousAuthentication enabled="false" userName="" />

                <basicAuthentication enabled="false" />

                <clientCertificateMappingAuthentication enabled="false" />

                <digestAuthentication enabled="false" />

                <iisClientCertificateMappingAuthentication enabled="false">
                </iisClientCertificateMappingAuthentication>

                <windowsAuthentication enabled="true">
                    <providers>
                        <add value="Negotiate" />
                        <add value="NTLM" />
                    </providers>
                </windowsAuthentication>

            </authentication>

Опитах да премахна

headers: new Headers({
            'content-type': 'application/json'
          })

Следва кодът на моя контролер за уеб API

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

namespace Backend.Controllers
{
    public class DemoController : ApiController
    {
        Entities db = new Entities();
        public DemoController ()
        {
        }

        [HttpPost]
        [ActionName("postevent")]
        public IHttpActionResult PostEvent(Demo data)
        {
            db.Demos.Add(data);
            db.SaveChanges();
            return Ok();
        }

    }
}

от моя ъглов код, но не помогна. Опитах се също да го заменя с „text/html“, но това също не проработи. Някой може ли да ми каже какво лошо правя. Предполагам, че трябва да работи добре, ако работи за GET.


person nikhil mehta    schedule 03.08.2017    source източник
comment
Каква Web API система използвате?   -  person Bailey Miller    schedule 04.08.2017
comment
За C# Web Api 2.0 трябва да декларирате метод за публикуване като такъв с атрибут [HttpPost].   -  person Bailey Miller    schedule 04.08.2017
comment
@BaileyMiller, да, направих това и също добавих име на действие и маршрут   -  person nikhil mehta    schedule 04.08.2017
comment
Мога ли да видя повече от действителния код на контролера?   -  person Bailey Miller    schedule 04.08.2017
comment
Сигурни ли сте, че операцията GET се удостоверява? Вашият метод на контролер има ли атрибута [Authorize]?   -  person Sal    schedule 04.08.2017
comment
@BaileyMiller Добави кода към въпроса   -  person nikhil mehta    schedule 04.08.2017
comment
@Paul не моят контролер няма [Authorize]. Предполагам, че предварителната проверка се задейства, тъй като заглавката на типа съдържание не е проста, тъй като има application/json като стойност.   -  person nikhil mehta    schedule 04.08.2017
comment
@nikhilmehta това същият контролер ли е, който също има крайна точка за получаване?   -  person Bailey Miller    schedule 04.08.2017
comment
@nikhilmehta Също така защо да активирате CORS чрез web.config, ако използвате Web Api 2.0, опитайте да използвате Owin за настройка на cors   -  person Bailey Miller    schedule 04.08.2017


Отговори (2)


Всички теми, които прочетох, посочват, че не можете да деактивирате напълно анонимното удостоверяване, в противен случай заявката за OPTIONS преди полет няма да работи. Това е така, защото:

Съгласно спецификациите на W3C, браузърът изключва потребителските идентификационни данни от предварителната проверка на CORS:

Моля, вижте тази тема например: WebAPI CORS с Windows Authentication - разреши Анонимна заявка OPTIONS

Основно решението е да се позволи на OPTIONS повикванията да преминават без удостоверяване. И за да е възможно това, анонимното удостоверяване трябва да бъде активирано.

В този въпрос: 401 отговор за CORS заявка в IIS с активиран Windows Auth Отговорът предлага следния web.config

<system.web>
  <authentication mode="Windows" />
    <authorization>
      <allow verbs="OPTIONS" users="*"/>
      <deny users="?" />
  </authorization>
</system.web>
person Sal    schedule 04.08.2017
comment
Не, това не помогна - person nikhil mehta; 04.08.2017
comment
Открих, че тази корекция работи добре. Използвайки IIS, трябваше да активирам както анонимно, така и Windows удостоверяване. След това добавете настройките за удостоверяване/упълномощаване по-горе към web.config. След това всички заявки за OPTIONS, изпратени от angular до моя уебсайт на API, бяха предадени успешно. - person Stuart; 13.06.2018

Отговорът на Павел е правилен. Имам абсолютно същата настройка и работи добре.

Трябва да се уверите, че сте активирали както Anonymous, така и Windows Authentication, добавете фрагмента от отговора на Paul към web.config, за да позволите неупълномощени заявки OPTIONS, и добавете атрибута [Authorize] на вашия контролер.

person Andrei Matracaru    schedule 06.08.2017