【问题标题】:.NetCore 2.2 Web Api with windows authentication returns 401 from other domains具有Windows身份验证的.Net Core 2.2 Web Api从其他域返回401
【发布时间】:2020-01-06 13:37:26
【问题描述】:

在我写这篇文章之前,我花了很多时间搜索并尝试了很多东西,但没有任何效果。这是一个 .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();
    }

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

【问题讨论】:

    标签: angular asp.net-core .net-core cors windows-authentication


    【解决方案1】:

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

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

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

    所以要么:

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

    【讨论】:

    • 从 Angular 应用程序调用 web api。两者都在受信任的站点上,并且它们是同一域的子域。它会打开询问凭据的对话框。
    • 您看到发送的授权标头了吗? (请注意,即使已发送,Chrome 开发工具也不会显示此标头,但 IE 会 - 或使用 Fiddler)
    • 您可以阅读有关 Windows 身份验证 here 的请求流程。它可能有助于理解应该发生的事情。
    • 感谢您提供的信息,但它不能解决问题。我的问题是,我怎样才能让它发挥作用?
    • 我知道 :) 这就是为什么我问您是否看到正在发送的授权标头。如果不发生这种情况,它将无法正常工作。
    【解决方案2】:

    更改中间件的顺序可能就是解决此问题所需的全部内容 - 请参阅此 Microsoft source on Middleware Order,它指定应在 UseAuthentication() 之前添加 UseCors()

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

    这个答案可能为时已晚,无法帮助 OP,但也许以后会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      相关资源
      最近更新 更多