删除和选项请求获得 401 未授权响应

Posted

技术标签:

【中文标题】删除和选项请求获得 401 未授权响应【英文标题】:Delete and Options requests gets a 401 unathorized response 【发布时间】:2021-01-04 02:26:41 【问题描述】:

我正在使用托管在远程 IIS 服务器上的 .net core web api 3.1,每次删除/选项请求我都会收到 401 未经授权的 html 响应,我在启动时允许使用 CORS,但没有运气。

更新:这是我的创业公司

public class Startup

    public Startup(IConfiguration configuration)
    
        Configuration = configuration;
    

    public IConfiguration Configuration  get; 

    public void ConfigureServices(IServiceCollection services)
    
        services.AddDbContext<BrmajaCommerceSearchContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SearchConnectionString")));
        services.AddDbContext<IdentityContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddCors(o => o.AddPolicy("AllowAll", b => b.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()));
        services.AddControllers().AddNewtonsoftJson(s =>
        
            s.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        );

        services.AddSwaggerGen(c =>
        
            c.SwaggerDoc("v1", new OpenApiInfo
            
                Title = "Ecommerce API",
                Version = "v1"
            );
            // Set the comments path for the Swagger JSON and UI.
            var xmlFile = Assembly.GetExecutingAssembly().GetName().Name + ".xml";
            var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
            c.IncludeXmlComments(xmlPath);
        );

        services.AddAuthentication()
    

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        


        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();
        app.UseCors("AllowAll");

        app.UseEndpoints(endpoints =>
        
            endpoints.MapControllers();
        );
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        
            c.SwaggerEndpoint("swagger/v1/swagger.json", "Ecommerce");
            c.RoutePrefix = string.Empty;
        );
    

【问题讨论】:

您介意发布 Startup.cs 吗?你的意思是它在 CUR 请求时返回 200? @MichaelWang 只有 GET 和 POST 返回 200 其余返回 401,我发布了启动 如果应用使用身份验证/授权功能,请在UseRoutingUseCors 之后、UseEndpoints 之前调用UseAuthenticationUseAuthorization。检查here。 @MichaelWang 这是一个 IIS 问题,因为请求没有到达它被返回 401 html 响应的 IIS 阻止的 api 我不明白。您可以在 UseAuthorization 之前尝试 moveup UseCors 作为我发布的链接,然后在 IIS 上重新启动您的服务。 【参考方案1】:

描述行为的最可能原因是 IIS WebDAV 模块为这些 HTTP 动词提供服务。您必须使用 IIS 配置管理器或包含的 web.config 文件禁用它

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <modules>
      <remove name="WebDAVModule" />
    </modules>
    <handlers>
      <remove name="WebDAV" />
    </handlers>
  </system.webServer>
<configuration>

【讨论】:

我用的是.net core 没有web.config 如果您使用 IIS,您当然可以将 web.config 放入您的 Web 应用程序的根目录,IIS 将使用它。相信我:) 我已经从 iis 服务器上卸载了 cors 功能,但没有成功。 @KasperRoma 我的回答与 CORS 无关。您必须以一种或另一种方式禁用 WebDAV 模块。如果您有权访问 IIS 配置管理器,则可以将其从“模块”页面中删除,或者您可以使用服务器管理器从通用 HTTP 功能中卸载 WebDAV 发布,或者您可以像我之前提到的那样简单地使用您的应用程序发布 web.config。 对不起,我错过了,我的意思是我已经卸载了 WebDAV Publishing。【参考方案2】:

通过启用 iis 服务器上的所有动词来解决 -> .NET 授权规则

【讨论】:

以上是关于删除和选项请求获得 401 未授权响应的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Web API:返回 401/未授权响应的正确方法

请求失败,HTTP 状态 401:未授权

我的 IIS 提示 HTTP 错误 404 - 文件或目录未找到。

CORS:对预检请求的响应未通过访问控制检查

一般的响应状态码

选项获得 401,但当我使用 Fiddler 时没有?