带有 Windows 身份验证预检问题的 Angular 4 HTTP POST [重复]

Posted

技术标签:

【中文标题】带有 Windows 身份验证预检问题的 Angular 4 HTTP POST [重复]【英文标题】:Angular 4 HTTP POST with windows authentication preflight issue [duplicate] 【发布时间】:2018-01-11 16:33:54 【问题描述】:

我在后端使用 Angular 4 和 ASP.NET Web api 2,并启用了 Windows 身份验证。我有一篇文章和一篇获取 api。 GET 工作正常。但是对于 POST 我收到此错误

预检响应包含无效的 HTTP 状态代码 401

这意味着我在 OPTIONS 方法中遇到未经授权的错误,我知道这不应该是这种情况,因为永远不会使用用户凭据调用 OPTIONS 方法。

在角度我调用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'
          )

以下是我的 web 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,它应该可以正常工作。

【问题讨论】:

你用的是什么Web api系统? 对于 C# Web Api 2.0,您需要声明一个 post 方法,使用 [HttpPost] 属性。 @BaileyMiller 是的,我已经做到了,并添加了 actionname 和 route 可以多看实际控制器代码吗? 您确定 GET 操作正在通过身份验证吗?您的控制器方法是否具有 [Authorize] 属性? 【参考方案1】:

我读过的所有主题都表明您不能完全禁用匿名身份验证,否则 OPTIONS 飞行前请求将不起作用。这是因为:

根据 W3C 规范,浏览器将用户凭据排除在 CORS 预检:

请参阅此主题,例如:WebAPI CORS with Windows Authentication - allow Anonymous OPTIONS request

基本上,解决方案是允许 OPTIONS 调用无需身份验证即可通过。为此,需要启用匿名身份验证。

在这个问题中:401 response for CORS request in IIS with Windows Auth enabled 答案建议使用以下 web.config

<system.web>
  <authentication mode="Windows" />
    <authorization>
      <allow verbs="OPTIONS" users="*"/>
      <deny users="?" />
  </authorization>
</system.web>

【讨论】:

不,这没有帮助 我发现这个修复工作正常。使用 IIS 我必须同时启用匿名和 Windows 身份验证。然后将上面的身份验证/授权设置添加到 web.config。之后,通过 Angular 向我的 API 网站发送的任何 OPTIONS 请求均已成功通过。【参考方案2】:

保罗的回答是正确的。我有完全相同的设置,它工作正常。

您需要确保同时启用匿名和 Windows 身份验证,将 Paul 回答中的 sn-p 添加到 web.config 以允许未经身份验证的 OPTIONS 请求,并在您的控制器上添加 [Authorize] 属性。

【讨论】:

以上是关于带有 Windows 身份验证预检问题的 Angular 4 HTTP POST [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core:带有 OPTIONS 异常的 Windows 身份验证(CORS 预检)

使用 Windows 身份验证启用 CORS ASP.NET Web API 2 应用程序中的预检请求

在 Angular 9 + Asp.net Core Web API 中启用 Windows 身份验证后,预检(选项)请求失败

在 Angular 2 中使用基本身份验证预检 CORS 请求

PouchDB 身份验证触发 CORS 预检请求

.NET Core Web API / Angular 应用程序中的 Windows 身份验证