带有 Windows 身份验证的 Web api 中的 Cors 问题

Posted

技术标签:

【中文标题】带有 Windows 身份验证的 Web api 中的 Cors 问题【英文标题】:Cors Issue in Web api with Windows Authentication 【发布时间】:2021-02-09 20:16:07 【问题描述】:

我正在尝试在 Web API 应用程序中启用 CORS 支持。在我的WebApiConfig.cs 文件中,我有以下代码:

var cors = new EnableCorsAttribute(origins: "http://localhost:19509",
                                               headers: "*",
                                               methods: "*");
config.EnableCors(cors);

但是,这不起作用。我已经尝试了以下链接中的每个建议,但它们也不起作用:

Asp.net web API CORS series/mysterious issue MVC web api: No 'Access-Control-Allow-Origin' header is present on the requested resource

我创建了一个没有授权/身份验证/安全实施的空项目,并尝试从我的前端点击这个空项目,并且成功了。基于此,我相信前端实现是好的。

是否有可能导致此问题的特定软件包,或者我需要更改的其他任何内容?

当我尝试使用禁用 cors 的 Chrome 浏览器时它会运行。

//在StartUp.cs文件中实现CORS后更新问题。

我也尝试在 StartUp.cs 文件中应用 cors,但没有运气。下面是我在 StartUp.cs 文件中的代码。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Abstractions;
using Microsoft.Owin;
using Owin;
using System.Web.Services;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.AspNetCore.Cors;

namespace xyz

    public partial class Startup
    
        public void Configuration(IAppBuilder app)
        
            ConfigureAuth(app);
        
    

【问题讨论】:

查看我的更新答案。基本上,如果它在浏览器中关闭 cors 时工作,则意味着服务器正在添加 Cors 标头,您只是从未列出的域发出请求。例如,您没有将 https 列入白名单。或者您正尝试从完全不同的域发出请求。 【参考方案1】:

    您可能应该将https:// 列入白名单。

    您可能应该从 Startup 配置 cors。

    您可能需要将 cors 配置为 AllowCredentials

    options.AddPolicy("Default", builder =>
    
       builder.WithOrigins("http://localhost:19509")
            .WithOrigins("https://localhost:19509")
            .AllowCredentials()
            .AllowAnyHeader()
            .AllowAnyMethod();
    );
    

然后您需要将 cors 策略添加到应用程序,以便将其应用于每个请求

public void Configure(IApplicationBuilder app)

    app.UseCors("Default");

在开发阶段的附带说明中,您可以打开 cors 政策并随着您的学习慢慢开始限制它。

编辑

“当我尝试使用禁用 cors 的 Chrome 浏览器时,它会运行。”

浏览器是强制执行 cors 的。如果它仅在禁用 cors 时运行,则表示正在从服务器正确添加 cors 标头。

听起来您的问题是客户。听起来您要么尝试从客户端拨打电话,域不同于 localhost:19509,要么在登录过程中的某个时刻,您正在使用更新示例中未配置的 Https。

【讨论】:

也尝试过这样做,但我无法获得所需的程序集 'Microsoft.Extensions.DependencyInjection' 。它在参考部分可见,但无法导入。跟安全有关系吗? @sharadjain 你是什么意思你不能得到所需的程序集?您使用的是什么版本的 .net/net-core。您可以发布您的 startup.cs 文件吗? 考虑到您的建议,我指的是以下链接:docs.microsoft.com/en-us/aspnet/core/security/… 但是在整理出所有组装错误之后,现在它说 IserviceCollection 不包含 AddCors 方法的定义。 StartUp.cs : public void ConfigureServices(IServiceCollection services) services.AddCors(options => options.AddPolicy("Default", builder => builder.WithOrigins("localhost:19509").AllowCredentials().AllowAnyHeader().Allo…; ); ); 请更新问题以另外包含 Startup.Cs 和您现在收到的错误,以及错误详细信息。我会更新答案 您好,我尝试了与启动文件相关的建议点,但没有奏效。我刚刚发现我的问题与匿名身份验证有关,如果我启用它,问题就会得到解决,如果我禁用匿名身份验证,就会出现 Cors 问题。我的项目要求是仅启用 Windows 身份验证。【参考方案2】:

所以最后我发布了解决问题并使用 Windows 身份验证运行我的解决方案的步骤:

1)安装 IIS Cors 模块。

2) 就我而言,IIS 设置是只启用 Windows 身份验证并禁用匿名身份验证。

3) 在您的 API 的 Web.config 中添加以下标签。

<system.webServer>
      <cors enabled="true">
          <add origin="<<>Your Origin>" allowed="true" />
      </cors>
      <httpProtocol>
          <customHeaders>
              <add name="Access-Control-Allow-Headers" value="Content-Type" />
              <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
              <add name="Access-Control-Allow-Credentials" value="true" />
          </customHeaders>
      </httpProtocol>

4)如果您现在收到 401 错误,这意味着您还需要设置授权,一个简单的解决方案是在请求中添加凭据。

【讨论】:

以上是关于带有 Windows 身份验证的 Web api 中的 Cors 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Windows 身份验证在 Web API 控制器中获取 NetworkCredential 或客户端凭据

在 HTTPS 上使用 Windows 身份验证首次调用 ASP.NET Core 2.0 Web API 在 Chrome 中总是失败

支持基本、匿名和 Windows 身份验证的 Web 服务/API

Web API 2.1 Windows 身份验证 CORS Firefox

(Monaca,Cordova)带有表单身份验证(Cookie)的 Web API 请求不起作用

如何将 Web api Windows 身份验证与 Angular 应用程序一起使用 [重复]