Как исправить подтверждение по электронной почте - в .NET Core это не работает

У меня уже есть действие регистрации

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("[email protected]", "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

Есть у кого-нибудь идеи?

Я следил за этой документацией из microsoft https://docs.microsoft.com/en-us/aspnet/core/security/authentication/accconfirm?view=aspnetcore-3.1&tabs=visual-studio


person Omar Khaled    schedule 03.04.2020    source источник
comment
Я добавил среду с пользователем и ключом для sendgrid из свойств - Отладка, и когда я снова зарегистрируюсь, перенаправьте меня в это представление В настоящее время в этом приложении не зарегистрирован реальный отправитель электронной почты, см. эти документы, чтобы узнать, как настроить настоящего отправителя электронной почты. Обычно это отправляется по электронной почте: Нажмите здесь, чтобы подтвердить свою учетную запись   -  person Omar Khaled    schedule 03.04.2020
comment
Расскажите, пожалуйста, подробнее о том, как вы измеряете, не работает. Какая система дает ссылку для подтверждения моей электронной почты? Это может быть вопрос к поддержке SendGrid.   -  person Eric Bolinger    schedule 04.04.2020


Ответы (2)


Когда я создаю новое веб-приложение с индивидуальными учетными записями пользователей, это работает отлично, но я заметил, что когда вы формируете идентификатор и переопределяете все страницы, чтобы иметь контроль в существующем приложении, поведение, которое вы испытываете, является обычным.

Вот как я это исправил:

Если вы открываете файл 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 (), и это должно сработать.

person Allan Gamboa    schedule 04.04.2020
comment
Вы протестировали его, работает для вас после того, как прокомментировал эту часть под этой строкой. После добавления настоящего отправителя электронной почты вы должны удалить этот код. - person Omar Khaled; 04.04.2020
comment
Правильно, теперь вы работаете с внешним входом, например, в Google или Microsoft? - person Allan Gamboa; 04.04.2020
comment
Нет, я не знаю, но все равно не работает, что заставляет меня перенаправлять на просмотр, проверьте свою электронную почту, чтобы подтвердить свою учетную запись - person Omar Khaled; 04.04.2020
comment
У меня вопрос, нужен ли мне домен для рассылки писем, полученных в Gmail? У меня нет, кто-то сказал мне, что мне нужно, чтобы он начал аутентификацию отправителя в sendgrid - person Omar Khaled; 04.04.2020
comment
У меня нет домена, и он работал, скажите мне что-нибудь, когда вы добавляли секреты для SendGridUser, вы использовали свое имя пользователя в данных учетной записи на портале UserGrid? - person Allan Gamboa; 04.04.2020
comment
Я не могу вас понять, но я использовал cmd, чтобы создать секретный файл, который я поместил пользователя, который я получил от sendgrid, затем я открыл секретный файл и создал пароль, вернув его правильно, я уверен, потому что когда я иду регистрироваться и goto sendgrid он говорит, что я отправил другое письмо, но Gmail так и не получил - person Omar Khaled; 04.04.2020
comment
У тебя нет решения, братан ??! - person Omar Khaled; 04.04.2020
comment
Подскажите пожалуйста, что именно вы сделали в sendgrid - person Omar Khaled; 04.04.2020
comment
Кто-то спросил о sendgrid в другом вопросе, и одним из ответов я спросил Sendgrid, и мне сказали, что я не могу использовать свою электронную почту Yahoo (или Gmail, ...) в качестве электронной почты отправителя; это часть ответа: Yahoo соблюдает стандарт безопасности электронной почты под названием DMARC. DMARC инструктирует провайдеров электронной почты отклонять сообщения, в которых домен From является доменом Yahoo, но сообщение исходит от неутвержденного сервера / службы домена. Поэтому мне нужно использовать свой собственный почтовый домен; - person Omar Khaled; 04.04.2020
comment
Итак, какой адрес электронной почты отправителя вы используете? - person Omar Khaled; 04.04.2020
comment
@OmarKhaled, похоже, использует адрес электронной почты частного домена, например. [email protected] должен решить проблемы, например, с адреса Yahoo / Gmail. - person MemeDeveloper; 09.06.2020
comment
Спасибо, у меня изначально это работало, а затем, как вы сказали, были созданы леса для страниц удостоверений, и это переписало мою первоначальную функциональность. Просто удалили оператор if. У меня есть учетная запись Gmail. Для кого-то еще я добавил папку Services и добавил AuthSenderMessageOptions.cs и EmailSender.cs из инструкций SendGrid. app.sendgrid.com/guide/integrate/langs/csharp (просто нужно адрес SendGrid) - person Mitchell; 02.07.2020

«Решено» Я спросил у Sendgrid, и мне сказали, что я не могу использовать свою электронную почту Yahoo (или Gmail, ...) в качестве электронной почты отправителя; это часть ответа: «Yahoo соблюдает стандарт безопасности электронной почты под названием DMARC. DMARC предписывает поставщикам электронной почты отклонять сообщения, в которых домен From является доменом Yahoo, но сообщение исходит от неутвержденного сервера / службы домена». Поэтому мне нужно использовать свой собственный почтовый домен;

person Omar Khaled    schedule 04.04.2020