【问题标题】:How do you disable HTTPS in ASP.NET Core project with Identity?如何使用 Identity 在 ASP.NET Core 项目中禁用 HTTPS?
【发布时间】:2020-03-12 08:43:12
【问题描述】:

我最近在 Visual Studio 2019 中创建了一个 ASP.NET Core 3.0 Web 应用程序项目(启用了 Docker,但我认为这不相关),并且在包含 ASP 时似乎无法禁用 HTTPS。 NET 个人用户帐户的身份。每当我在调试器中启动应用程序时,页面都会使用 HTTPS 打开并导航到 HTTP 会再次将我重定向回来。

我尝试创建一个新项目来测试发生了什么,并发现了以下内容:

在创建项目时,我启用了 ASP.NET 身份,以便在我的应用程序中使用本地帐户,我注意到如果我再次通过向导以创建具有相同设置的项目(网络应用程序为单个用户帐户启用身份)取消选中启用 HTTPS 的框的选项显示为灰色。

创建项目后,我尝试通过注释掉相关行来禁用 Startup.cs 中的 HTTPS 重定向中间件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
            //app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

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

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                endpoints.MapRazorPages();
            });
        }

并且编辑了launchSettings.json 以尝试让应用在调试时使用 HTTP 而不是 HTTPS 运行,但应用仍然尝试使用 HTTPS 加载。

launchSettings.json之前:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:51767",
      "sslPort": 44396
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "HTTPSTest": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "https://localhost:5001;http://localhost:5000"
    },
    "Docker": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
      "environmentVariables": {
        "ASPNETCORE_URLS": "https://+:443;http://+:80",
        "ASPNETCORE_HTTPS_PORT": "44397"
      },
      "httpPort": 51777,
      "useSSL": true,
      "sslPort": 44397
    }
  }
}

launchSettings.json之后:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:51767"
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "HTTPSTest": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5000"
    },
    "Docker": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
      "environmentVariables": {
      },
      "httpPort": 51777
    }
  }
}

有人对我接下来可以尝试什么有任何想法吗?我希望应用程序位于终止 SSL 的反向代理之后,所以我认为禁用它是不合理的。

【问题讨论】:

    标签: asp.net-mvc ssl asp.net-core https asp.net-identity


    【解决方案1】:

    从内存中,您可以在项目设置中更改端口。

    右键单击项目,然后单击属性 单击调试。 在 Profile IIS Express 下,将端口更改为 5000,即您的 http 端口。

    【讨论】:

    • 对不起,但这不是问题——我使用 Docker 配置文件运行它,它在端口 51777 上正确打开了浏览器选项卡,但使用的是 https。将 https 更改为 http 只是再次重定向回 https,并且设置文件中的其他端口都不起作用。此外,项目属性中“调试”选项卡中的这些更改与 launchSettings.json 中的设置相同。
    • 我在 Chrome 上看到了同样的行为。我开发了一个 Web API 和客户端,我的 IT 部门一直在尝试部署它。他们得到 404,但事实证明他们没有跟随控制器 [Route...]。我们在不同的州,都很偏远,所以没什么大不了的。我尝试使用 Chrome 中的正确路由直接浏览它 - 404。但 Chrome 总是试图转到“https//mystuff”而不是“mystuff”(不是 https)。我在 Bing 中尝试过,第一次就成功了....
    【解决方案2】:

    所以我实际上设法解决了这个问题。我在 Visual Studio 使用 HTTPS 打开应用程序时看到的问题是 Visual Studio 的问题。

    通过注释掉Startup.cs 中的app.UseHttpsRedirection() 行并删除launchSettings.json 中的SSL 引用,在另一台计算机上运行相同的设置工作得很好,就像我原来的帖子一样——运行调试器使用HTTP 打开页面并且能够连接到应用程序。

    为了让一切恢复正常,我尝试完全删除 Visual Studio,重新启动,重新安装并再次尝试,但仍然遇到同样的问题。最后,我还必须删除我的用户目录中AppData 下的所有 Visual Studio 文件夹,然后重新安装 Visual Studio,然后当我尝试调试我的项目时它终于又可以工作了!

    更新:
    这实际上是在周末之后回来的,我发现这一次我的问题是HSTS在Chrome中缓存了HTTPS的使用。可以在此处找到如何针对不同浏览器删除此内容的示例:https://appuals.com/how-to-clear-or-disable-hsts-for-chrome-firefox-and-internet-explorer/

    总之,对于 Chrome:
    1. 导航至chrome://net-internals/#hsts
    2. 在Delete domain security policies 部分,输入localhost 作为域并点击Delete 按钮

    更新 2 - 警告 尽管此“修复”允许我使用 HTTP 运行我的项目,但我确实发现除非启用 HTTPS,否则 Identity 将不允许我登录 - 我认为这与 SignInManager 设置仅 HTTPS 身份验证 cookie 有关 - 请参见此处更多详情:AspNet Core Identity - cookie not getting set in production

    【讨论】:

    • 如果我没记错的话,带有身份的 Asp.Net Core 通常出于最佳实践原因强制使用 https。但是,您可以滚动自定义 SignIn 和 Usermanager 实现的自己的实现,以跳过 Identity 的强制执行。
    • 谢谢。你有什么例子吗?使用 HTTP 似乎是一件复杂的事情
    • 检查this。您基本上必须构建一个处理用户登录的自定义存储或实现您自己的 SignInManager 以使 Identity 接受 HTTP。检查身份源代码哪个代码决定是否使用 HTTPS 并覆盖这部分。
    【解决方案3】:

    我实现了上面的大部分建议。然后,在客户端使用OpenIdConnectDefaults.AuthenticationScheme并设置值时:

    options.RequireHttpsMetadata = false;

    根据:

    https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.openidconnect.openidconnectoptions.requirehttpsmetadata

    我能够使用 Firefox 通过 HTTP 使用 IdentityServer4 进行身份验证和授权。

    由于某种原因,Chrome 坚持设置请求头:

    Upgrade-Insecure-Requests: 1

    这会导致回发尝试 HTTPS 并因此失败。

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 2021-06-06
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多