使用反向代理的 Apache 服务器上 ASP.NET 核心网络应用程序 运行 的帐户确认错误
Account Confirmation error on ASP.NET Core web app running on Apache server using reverse proxy
我有一个使用 ASP.NET Core 构建的示例 MVC Web 应用程序。我还启用了帐户确认,因此当用户注册时,他们会收到一封电子邮件确认。当我在我的开发机器 (http://localhost:5000) 上使用 Kestrel 服务器在本地 运行 时,我的 Web 应用程序 运行 正常,帐户确认工作正常。
现在我已经使用反向代理(https://musicstore.paul.kim).我已经使用 Let's Encrypt 获得了 musicstore.paul.kim 的免费 SSL 证书。我已将反向代理设置为将请求从 http://localhost:5000 转发到 https://musicstore.paul.kim。一切似乎 运行 都很好,除了帐户确认不起作用。当我尝试通过输入电子邮件并创建密码来注册新用户时,我通过 SendGrid 收到一封电子邮件,其中包含 link 以确认我的电子邮件。当我单击那个 link 时,我被带到我的网络应用程序并显示一条错误消息,而不是确认电子邮件。我查看了我的日志文件,错误消息是 "Microsoft.AspNetCore.Identity.UserManager[9] VerifyUserTokenAsync() failed with purpose: EmailConfirmation for user 54a1c48c-4af7-454a-9c57-6b78c671be56."
为什么帐户确认在使用反向代理的 Apache 上不起作用?
我怎样才能让它工作?
问题出在我们丢失了客户端的原始请求协议。我们可以在startup.cs:
中的"Configure"中加入这段代码来处理
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
此外,您必须在虚拟主机文件中配置 apache/nginx:
RequestHeader set X-Forwarded-Proto "https"
这应该可以解决问题! ;-)
我有一个使用 ASP.NET Core 构建的示例 MVC Web 应用程序。我还启用了帐户确认,因此当用户注册时,他们会收到一封电子邮件确认。当我在我的开发机器 (http://localhost:5000) 上使用 Kestrel 服务器在本地 运行 时,我的 Web 应用程序 运行 正常,帐户确认工作正常。
现在我已经使用反向代理(https://musicstore.paul.kim).我已经使用 Let's Encrypt 获得了 musicstore.paul.kim 的免费 SSL 证书。我已将反向代理设置为将请求从 http://localhost:5000 转发到 https://musicstore.paul.kim。一切似乎 运行 都很好,除了帐户确认不起作用。当我尝试通过输入电子邮件并创建密码来注册新用户时,我通过 SendGrid 收到一封电子邮件,其中包含 link 以确认我的电子邮件。当我单击那个 link 时,我被带到我的网络应用程序并显示一条错误消息,而不是确认电子邮件。我查看了我的日志文件,错误消息是 "Microsoft.AspNetCore.Identity.UserManager[9] VerifyUserTokenAsync() failed with purpose: EmailConfirmation for user 54a1c48c-4af7-454a-9c57-6b78c671be56."
为什么帐户确认在使用反向代理的 Apache 上不起作用?
我怎样才能让它工作?
问题出在我们丢失了客户端的原始请求协议。我们可以在startup.cs:
中的"Configure"中加入这段代码来处理app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
此外,您必须在虚拟主机文件中配置 apache/nginx:
RequestHeader set X-Forwarded-Proto "https"
这应该可以解决问题! ;-)