【问题标题】:How can I fix email confirmation - in .NET Core, it doesn't work如何修复电子邮件确认 - 在 .NET Core 中,它不起作用
【发布时间】:2020-04-03 15:11:10
【问题描述】:

我已经有注册操作了

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
            var useremail = _userManager.Users.FirstOrDefault(u => u.Email.ToLower() == Input.Email.ToLower());

            if (useremail == null)
            {
                returnUrl = returnUrl ?? Url.Content("~/");
                ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();

                if (ModelState.IsValid)
                {
                    var user = new IdentityUser { UserName = Input.UserName, Email = Input.Email };
                    var result = await _userManager.CreateAsync(user, Input.Password);
                    if (result.Succeeded)
                    {
                        _logger.LogInformation("User created a new account with password.");

                        var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                        code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
                        var callbackUrl = Url.Page(
                            "/Account/ConfirmEmail",
                            pageHandler: null,
                            values: new { area = "Identity", userId = user.Id, code = code },
                            protocol: Request.Scheme);

                        await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                            $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                        if (_userManager.Options.SignIn.RequireConfirmedAccount)
                        {
                            return RedirectToPage("RegisterConfirmation", new { email = Input.Email });
                        }
                        else
                        {
                            await _signInManager.SignInAsync(user, isPersistent: false);
                            return LocalRedirect(returnUrl);
                        }
                    }

                    foreach (var error in result.Errors)
                    {
                        ModelState.AddModelError(string.Empty, error.Description);
                    }
                }
            }
            // If we got this far, something failed, redisplay form
            ViewData["EmailExists"] = "Try another email that one is used";

            return Page();
}

然后我创建了 sendgrid 用户和密钥并通过 CMD 注册它们,然后我创建了发送电子邮件的动作

public class EmailSender : IEmailSender
{
        public EmailSender(IOptions<AuthMessageSenderOptions>optionsAccessor)
        {
            Options = optionsAccessor.Value;
        }

        public AuthMessageSenderOptions Options { get; }

        public Task SendEmailAsync (string email , string subject , string message)
        {
            return Excute(Options.SendGridKey,subject,message,email);
        }

        private Task Excute(string apiKey, string subject, string message, string email)
        {
            var client = new SendGridClient(apiKey);
            var msg = new SendGridMessage()
            {
                From = new EmailAddress("darydress@yahoo.com", "dary dress"),
                Subject = subject,
                PlainTextContent = message,
                HtmlContent = message
            };

            msg.AddTo(new EmailAddress(email));
            msg.SetClickTracking(false, false);

            return client.SendEmailAsync(msg);
        }
}

然后在startup.cs中

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
          options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));
    services.AddIdentity<IdentityUser, IdentityRole>( options => options.SignIn.RequireConfirmedAccount = true)
                .AddDefaultUI()
                .AddDefaultTokenProviders()
                .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddControllersWithViews();
    services.AddRazorPages();
    services.AddMvc();
    services.AddTransient<IEmailSender, EmailSender>();
    services.Configure<AuthMessageSenderOptions>(Configuration);
    services.AddPaging();
    services.ConfigureApplicationCookie(o => {
                o.ExpireTimeSpan = TimeSpan.FromDays(5);
                o.SlidingExpiration = true;
            });
    services.AddMvc(options =>
            {
                options.Filters.Add(new RequireHttpsAttribute());
            });
    services.ConfigureApplicationCookie(options =>
            {
                options.AccessDeniedPath = new Microsoft.AspNetCore.Http.PathString("/Main/AccessDenied");
            });
}

但是在注册后发送电子邮件不起作用给了我一些我需要确认我的电子邮件并给我链接以确认我的电子邮件但不将其发送到 gmail

有人有想法吗?

我遵循了微软的这个文档 https://docs.microsoft.com/en-us/aspnet/core/security/authentication/accconfirm?view=aspnetcore-3.1&tabs=visual-studio

【问题讨论】:

  • 我为 sendgrid 属性添加了用户和密钥的环境 - 调试,当我再次注册时将我重定向到此视图 此应用当前没有注册真正的电子邮件发件人,请参阅这些文档了解如何配置真正的电子邮件发件人。通常会通过电子邮件发送:单击此处确认您的帐户
  • 请告诉我们更多关于您如何衡量“不起作用”的信息。哪个系统“提供链接以确认我的电子邮件”?这可能是 SendGrid 支持的问题。

标签: c# asp.net-identity asp.net-core-3.0


【解决方案1】:

当我使用个人用户帐户创建一个新的 Web 应用程序时,这非常有效,但我注意到,当您搭建身份并覆盖所有页面以控制现有应用程序时,您遇到的行为是常见的。

这是我修复它的方法:

如果您打开文件 Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs 查找注释 Once you add a real email sender, you should remove this code that lets you confirm the account,请在 return Page() 语句之前注释该行下方的所有内容,这样就可以完成工作。

【讨论】:

  • 您对其进行了测试,在“添加真正的电子邮件发件人后,您应该删除此代码”这一行下方评论该部分后对您有效
  • 正确,现在,您使用的是 Google 或 Microsoft 等外部登录吗?
  • 不,我没有,但仍然无法正常工作,这让我重定向到查看您的电子邮件以确认您的帐户
  • 我有一个问题,我需要一个域来制作在 gmail 收到的电子邮件吗?我还没有,有人告诉我,我需要它在 sendgrid 发件人身份验证中开始
  • 我没有域并且它确实有效,告诉我一些事情,当您为 SendGridUser 添加机密时,您是否在 UserGrid 门户的帐户详细信息下使用了您的用户名?
【解决方案2】:

“解决了”我问了 Sendgrid,我被告知我不能使用我的 yahoo 电子邮件(或 gmail,...)作为发件人电子邮件;这是答案的一部分:“雅虎遵守称为 DMARC 的电子邮件安全标准。DMARC 指示电子邮件提供商拒绝发件人域是雅虎域的邮件,但邮件来自未经批准的域服务器/服务。”所以我需要使用自己的邮件域;

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2018-12-07
    • 2020-08-16
    相关资源
    最近更新 更多