.NET MVC Core Проверка электронной почты SendGrid не работает - PullRequest
0 голосов
/ 24 декабря 2018

Следуя инструкциям Microsoft, как указано ниже, но все еще не удается отправить электронное письмо.

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/accconfirm?view=aspnetcore-2.2&tabs=visual-studio

Я потратил некоторое время на отладку и обнаружил, что проблема связана сследующий код ниже возвращает нулевые значения для SendGridUser и SendGridKey.Кто-нибудь знает, как решить эту проблему?Спасибо!

Options = optionsAccessor.Value;

Secrets.json

{
  "SendGridUser": "apiKeyName",
  "SendGridKey": "<ApiKey>"
}

enter image description here

EmailSender.cs

using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.Extensions.Options;
using SendGrid;
using SendGrid.Helpers.Mail;
using System.Threading.Tasks;
using ProjectName.Areas.Identity.Services;

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

        public AuthMessageSenderOptions Options { get; } //set only via Secret Manager

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

        public Task Execute(string apiKey, string subject, string message, string email)
        {
            var client = new SendGridClient(apiKey);
            var msg = new SendGridMessage()
            {
                From = new EmailAddress("Joe@contoso.com", "Joe Smith"),
                Subject = subject,
                PlainTextContent = message,
                HtmlContent = message
            };
            msg.AddTo(new EmailAddress(email));

            // Disable click tracking.
            // See https://sendgrid.com/docs/User_Guide/Settings/tracking.html
            msg.SetClickTracking(false, false);

            return client.SendEmailAsync(msg);
        }
    }
}

AuthMessageSenderOption.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ProjectName.Areas.Identity.Services
{
    public class AuthMessageSenderOptions
    {
        public string SendGridUser { get; set; }
        public string SendGridKey { get; set; }
    }
}

IdentityHostingStartup.cs

using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using ProjectName.Data;

[assembly: HostingStartup(typeof(ProjectName.Areas.Identity.IdentityHostingStartup))]
namespace ProjectName.Areas.Identity
{
    public class IdentityHostingStartup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureServices((context, services) => {

                services.AddDefaultIdentity<IdentityUser>(config =>
                {
                    config.SignIn.RequireConfirmedEmail = true;
                })
                .AddEntityFrameworkStores<ApplicationDbContext>();

            });
        }
    }
}

Конфигурация из Startup.cs Закомментированные сервисы. Идентификационные данные как вызывающие конфликт с IdentityHostingStartup

//services.AddIdentity<IdentityUser, IdentityRole>()
//    .AddEntityFrameworkStores<ApplicationDbContext>()
//    .AddDefaultTokenProviders();        

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddRazorPagesOptions(options =>
        {
            options.AllowAreas = true;
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

        services.ConfigureApplicationCookie(options =>
        {
            options.LoginPath = $"/Identity/Account/Login";
            options.LogoutPath = $"/Identity/Account/Logout";
            options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
        });

        // using Microsoft.AspNetCore.Identity.UI.Services;
        //services.AddSingleton<IEmailSender, EmailSender>();

        // requires
        services.AddSingleton<IEmailSender, EmailSender>();
        services.Configure<AuthMessageSenderOptions>(Configuration);

1 Ответ

0 голосов
/ 28 декабря 2018

Извините, это была ошибка с моей стороны.Все правильно.

Следующий код был закомментирован и заменен для чтения переменных окружения откуда-то еще и, следовательно, причина, по которой значения были нулевыми.Большое спасибо!

public Startup(IConfiguration configuration)
       {
           Configuration = configuration;
       }
...