首页 > 解决方案 > 具有 Windows 身份验证的 .NetCore 2.2 Web Api 从其他域返回 401

问题描述

在我写这篇文章之前,我花了很多时间搜索和尝试很多东西,但没有任何效果。这是一个 .NetCore 2.2 Web Api,我从 Angular 8 应用程序中使用它。

  1. 如果我从同一个域调用 web api,它工作正常。

  2. 如果我从其他域(或本地主机)调用 web api,它会返回 401(未经授权)。

  3. 如果我在禁用 Windows 身份验证的情况下从其他域(或本地主机)调用 Web api - 它工作正常(因此正确配置了 CORS)。

在我的launchSettings.json我有:

  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,

在我的web.config我有:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
      </httpProtocol>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" />
      </handlers>
      <aspNetCore processPath="%LAUNCHER_PATH%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" arguments="%LAUNCHER_ARGS%" />
      <security>
        <authentication>
           <anonymousAuthentication enabled="false" />
           <windowsAuthentication enabled="true" />
        </authentication>
      </security>
    </system.webServer>
  </location>
</configuration>

IIS中,我启用了 Windows 身份验证并禁用了匿名身份验证。

在我的Startup.cs中,我有:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(IISDefaults.AuthenticationScheme);
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
            builder =>
            {
               builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader()
               .AllowCredentials();
            });
        });

        services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
     }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseAuthentication();
        app.UseCors("CorsPolicy");
        app.UseMvc();
    }

我错过了什么?对此有什么想法吗?

标签: angularasp.net-core.net-corecorswindows-authentication

解决方案


我假设对 Web API 的请求是从浏览器发起的?

使用 Windows 身份验证时需要 401 响应。然后客户端应使用正确的凭据重新发送请求。

可以将浏览器配置为自动发送当前登录用户的凭据。如果站点在 Internet 选项中的受信任站点列表中,IE 和 Chrome 将执行此操作。Firefox 有自己的network.negotiate-auth.delegation-uris设置。

所以要么:

  1. 浏览器不信任该站点,因此它不会自动发送凭据,或者
  2. 您服务器的域不信任用户的域,因此即使浏览器发送当前用户的凭据,它们也会被第二个 401 响应拒绝。

推荐阅读