首页 > 解决方案 > ASP.NET Core 3.1 + CORS + Windows 身份验证 = 401 未经授权

问题描述

我已经在 IIS 10 上托管的 .NET Core 3.1(.201) Web API 中配置了IIS CORS 模块,现在我收到401 Unauthorized了针对 Windows 身份验证用户的 GET(不是 OPTIONS)请求,无论是否具有控制器或操作级别的[Authorize]属性。Swagger 反而通过,在同一个动作中返回 200,所以我认为授权有效,因此问题一定与 CORS 有关。

我已经看到了一些启用匿名身份验证和设置一些授权过滤器的解决方法,Startup.cs但我想坚持使用 IIS CORS 模块,因为它旨在正确涵盖这种情况等。

所以也许有人可以帮我弄清楚我做错了什么。

网络配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <authentication mode="Windows" />
    <authorization>
      <allow users="*" />
    </authorization>
  </system.web>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <cors enabled="true" failUnlistedOrigins="false">
        <add origin="http://localhost:4300" allowCredentials="true">
          <allowHeaders allowAllRequestedHeaders="true">
            <add header="credentials" />
          </allowHeaders>
        </add>
      </cors>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="...\bin\Debug\netcoreapp3.1\MyProj.Api.exe" hostingModel="InProcess" forwardWindowsAuthToken="true">
        <environmentVariables>
          <environmentVariable name="COMPLUS_ForceENC" value="1" />
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
        </environmentVariables>
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>

启动.cs

services.AddAuthentication(IISDefaults.AuthenticationScheme);

...

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.UseStaticFiles();

app.UseEndpoints(endpoints => ...

javascript 请求(使用fetch API)设置credentials: include标头。

我还尝试了 Rick Strahl在其出色的网络日志中建议的方法,但得到了相同的结果:401

标签: corsauthorizationwindows-authenticationasp.net-core-3.1iis-10

解决方案


您是否尝试在 Startup 类中添加 CORS?

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

    ...
}

在 Configure 方法中:

app.UseCors("CorsPolicy");

推荐阅读