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