0

我有一个使用 ASP.NET Core 构建的示例 MVC Web 应用程序。我还启用了帐户确认功能,因此当用户注册时,他们会收到一封电子邮件确认。当我使用开发机器上的 Kestrel 服务器 ( http://localhost:5000 ) 在本地运行它时,我的 Web 应用程序运行良好并且帐户确认工作正常。

现在,我已使用反向代理 ( https://musicstore.paul.kim )将我的 Web 应用程序发布到运行 Apache Web 服务器的 Ubuntu 服务器上。我使用 Let's Encrypt 获得了 musicstore.paul.kim 的免费 SSL 证书。我已将反向代理设置为将请求从http://localhost:5000转发到https://musicstore.paul.kim. 除了帐户确认不起作用外,一切似乎都运行良好。当我尝试通过输入电子邮件并创建密码来注册新用户时,我会通过 SendGrid 收到一封电子邮件,其中包含用于确认我的电子邮件的链接。当我单击该链接时,我会被带到我的网络应用程序并显示一条错误消息,而不是确认电子邮件。我查看了我的日志文件,错误消息是“Microsoft.AspNetCore.Identity.UserManager[9] VerifyUserTokenAsync() failed with purpose: EmailConfirmation for user 54a1c48c-4af7-454a-9c57-6b78c671be56”。

为什么帐户确认无法在具有反向代理的 Apache 上工作?

我怎样才能让它工作?

4

1 回答 1

2

问题在于我们丢失了客户端的原始请求协议。我们可以通过将此代码添加到 startup.cs 中的“配置”来处理它:

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

此外,您必须在您的 vhost 文件中配置您的 apache/nginx:

RequestHeader set X-Forwarded-Proto "https"

这应该够了吧!;-)

于 2017-05-25T09:52:40.083 回答