You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6邮件确认回调URL异常问题求助

ASP.NET Core 6 Razor Pages 邮件确认URL发布后异常问题解决

问题现象

本地调试时邮件确认回调URL完全正常,但发布到生产环境后,生成的URL缺失https://前缀,用户点击确认按钮后,原URL http://www.detailandgo.co.uk/Identity/Account/ConfirmEmail?userId=blablabla&code=foobar 重定向为 https://www.detailandgo.co.ukidentity/Account/ConfirmEmail?userId=blablabla&code=foobar——域名与Identity路径之间缺少斜杠,手动添加斜杠后功能恢复正常。

原生成URL代码

_logger.LogInformation("User created a new account with password.");
_userManager.Options.SignIn.RequireConfirmedEmail = true;
var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var test = Request.Scheme;
var callbackUrl = Url.Page(
    "/Account/ConfirmEmail",
    pageHandler: null,
    values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
    protocol: Request.Scheme);                   
string encodedCallBackUrl = HtmlEncoder.Default.Encode(callbackUrl);

Email email = new Email();
using (StreamReader reader = System.IO.File.OpenText(_webHostEnvironment.WebRootPath + "/Email/index.html"))
{
    email.From = "info@detailandgo.co.uk";
    email.Body = reader.ReadToEnd()
        .Replace("{callbackUrl}", encodedCallBackUrl)
        .Replace("{firstName}", Input.FirstName)
        .Replace("{callbackBook}", Url.Page("/Index"));
    email.IsHtml = true;
    email.Subject = Input.FirstName + ", confirm your Detail&Go account";
    email.To = Input.Email;
}

解决方案

1. 配置Forwarded Headers中间件

生产环境中应用通常部署在反向代理(如IIS、Nginx)之后,导致Request.Scheme无法正确获取外部请求的https协议。在Program.cs中添加Forwarded Headers中间件,确保应用识别真实的请求协议:

// 放在UseAuthentication和UseAuthorization之前
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

2. 强制指定协议与主机名

直接在生成URL时显式指定https协议和完整主机名,避免依赖Request对象的自动获取:

var callbackUrl = Url.Page(
    "/Account/ConfirmEmail",
    pageHandler: null,
    values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
    protocol: "https",
    host: "www.detailandgo.co.uk");

3. 检查邮件模板与替换逻辑

确认Email/index.html模板中{callbackUrl}的位置没有额外的拼接错误,比如不要写成https://{callbackUrl}(会导致协议重复),确保替换后的URL是完整的格式。

4. 排查服务器重定向规则

检查服务器的URL重写/反向代理配置:

  • IIS:确认URL重写规则的正则表达式没有误删路径中的斜杠
  • Nginx:确保proxy_pass指令末尾添加斜杠(如proxy_pass https://your-app/;),避免路径拼接丢失斜杠

内容的提问来源于stack exchange,提问作者Lukas Slivka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:01:01