如何在 ASP.NET Core 项目中禁用 HTTPS with Identity?
How do you disable HTTPS in ASP.NET Core project with Identity?
我最近在 Visual Studio 2019 年创建了一个 ASP.NET Core 3.0 Web 应用程序项目(启用了 Docker,但我认为这不相关),并且不要似乎能够在包含个人用户帐户的 ASP.NET 身份时禁用 HTTPS。每当我在调试器中启动应用程序时,页面都会使用 HTTPS 打开,然后导航到 HTTP 会再次将我重定向回来。
我已经尝试创建一个新项目来测试发生了什么,并发现了以下内容:
在创建项目时,我启用了 ASP.NET Identity 以便在我的应用程序中使用本地帐户,我注意到如果我再次通过向导来创建一个相同的项目设置(为个人用户帐户启用身份的 Web 应用程序)取消选中启用 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 的反向代理之后,因此我认为禁用它是不合理的。
凭记忆,可以在项目设置中更改端口。
右键单击项目,然后单击属性
单击调试。
在配置文件 IIS Express 下,将端口更改为 5000,即您的 http 端口。
所以我实际上设法解决了这个问题。我在 Visual Studio 使用 HTTPS 打开应用程序时看到的问题是 Visual Studio.
的问题
运行 在另一台计算机上通过相同的设置工作得很好,通过注释掉 Startup.cs
中的 app.UseHttpsRedirection()
行并删除 launchSettings.json
中的 SSL 引用,就像在我的原始 post - 运行调试器使用 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 - 警告
尽管此 "fix" 允许我使用 HTTP 运行 我的项目,但我确实发现除非启用 HTTPS,否则身份不允许我登录 - 我认为这与 SignInManager 设置 HTTPS 有关 -仅身份验证 cookie - 请参阅此处了解更多详细信息:
我实施了上面的大部分建议。然后,在客户端使用 OpenIdConnectDefaults.AuthenticationScheme
并设置值时:
options.RequireHttpsMetadata = false;
根据:
我能够使用 Firefox 通过 HTTP 使用 IdentityServer4 进行身份验证和授权。
出于某种原因Chrome坚持设置请求头:
Upgrade-Insecure-Requests: 1
这会导致回发尝试 HTTPS 并因此失败。
我最近在 Visual Studio 2019 年创建了一个 ASP.NET Core 3.0 Web 应用程序项目(启用了 Docker,但我认为这不相关),并且不要似乎能够在包含个人用户帐户的 ASP.NET 身份时禁用 HTTPS。每当我在调试器中启动应用程序时,页面都会使用 HTTPS 打开,然后导航到 HTTP 会再次将我重定向回来。
我已经尝试创建一个新项目来测试发生了什么,并发现了以下内容:
在创建项目时,我启用了 ASP.NET Identity 以便在我的应用程序中使用本地帐户,我注意到如果我再次通过向导来创建一个相同的项目设置(为个人用户帐户启用身份的 Web 应用程序)取消选中启用 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 的反向代理之后,因此我认为禁用它是不合理的。
凭记忆,可以在项目设置中更改端口。
右键单击项目,然后单击属性 单击调试。 在配置文件 IIS Express 下,将端口更改为 5000,即您的 http 端口。
所以我实际上设法解决了这个问题。我在 Visual Studio 使用 HTTPS 打开应用程序时看到的问题是 Visual Studio.
的问题运行 在另一台计算机上通过相同的设置工作得很好,通过注释掉 Startup.cs
中的 app.UseHttpsRedirection()
行并删除 launchSettings.json
中的 SSL 引用,就像在我的原始 post - 运行调试器使用 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 - 警告
尽管此 "fix" 允许我使用 HTTP 运行 我的项目,但我确实发现除非启用 HTTPS,否则身份不允许我登录 - 我认为这与 SignInManager 设置 HTTPS 有关 -仅身份验证 cookie - 请参阅此处了解更多详细信息:
我实施了上面的大部分建议。然后,在客户端使用 OpenIdConnectDefaults.AuthenticationScheme
并设置值时:
options.RequireHttpsMetadata = false;
根据:
我能够使用 Firefox 通过 HTTP 使用 IdentityServer4 进行身份验证和授权。
出于某种原因Chrome坚持设置请求头:
Upgrade-Insecure-Requests: 1
这会导致回发尝试 HTTPS 并因此失败。