Ошибка состояния модели при внешней аутентификации Facebook

#authentication #asp.net-core #configuration #modelstate

#аутентификация #asp.net-core #конфигурация #modelstate

Вопрос:

Я изучаю ASP.NET Платформа Core 2.2 MVC. Я создал простое приложение, дал ему имя и в настоящее время работаю с документацией Microsoft, чтобы заставить его работать. Моя текущая цель — настроить внешнюю аутентификацию Facebook.

У меня есть шаблон Visual Studio, который включает проверку подлинности отдельной учетной записи пользователя, и я планирую развернуть это приложение в облаке Azure. Я выполнил все шаги, чтобы зарегистрировать свое приложение на странице Facebook для разработчиков. Я специально не хочу жестко кодировать идентификатор приложения Facebook и секрет файла запуска, потому что я хочу реализовать Azure key vault для повышения безопасности. Я выбираю использовать Azure key vault вместо локальных секретов, потому что я хочу развернуть это решение в облаке.

Проблема в том, что если я запускаю решение, я вижу, что отображается правильная кнопка, чтобы перейти к аутентификации Facebook. Он перенаправляет меня на их страницу ошибок, и в отладчике я вижу эту ошибку:

Майкрософт.AspNetCore.Mvc.RazorPages.Внутренняя.PageActionInvoker: Информация: Выполнение метода обработчика RecipeBox3._0.Areas.Идентификация.Страницы.Учетная запись.ExternalLoginModel.Сообщение OnPost с аргументами (Facebook, /) — ModelState недопустимо

Документации по этой ошибке нет, и я бегаю по кругу, пытаясь выяснить причину этой ошибки. Могу ли я каким-либо образом получить некоторую помощь?

Я перепробовал множество исследований того, что Facebook нужно передать; если им нужно больше, чем идентификатор и секрет, то я не могу найти ничего, что говорит об этом. Я попытался выполнить шаги, чтобы выяснить, какие данные передаются Facebook, но безуспешно, из-за отсутствия фундаментального понимания того, как ASP.Net Ядро обрабатывает идентификацию и службы.

Это бит в моей конфигурации запуска, который я называю своим Facebook class, который считывается из Azure Key Vault

  services.Configure<Facebook>(Configuration);
            services.AddTransient<Facebook>();
            services.AddAuthentication().AddFacebook(facebookOptions =>
                        {
                            facebookOptions.AppId = Options.facebookID.ToString();
                            facebookOptions.AppSecret = Options.FacebookSecret.ToString();
                        });

            services.Configure<RecipeBox3._0.Services.SendGrid>(Configuration);
            services.AddTransient<IEmailSender, EmailSender>();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  

Это мой класс Facebook (регистр точно соответствует тому, что находится внутри хранилища ключей)

 public class Facebook
{
   public long facebookID { get; set; }
   public long FacebookSecret { get; set; }
}
  

Комментарии:

1. ОБНОВЛЕНИЕ: это работает, если я жестко закодирую идентификатор и секрет. Так что, должно быть, что-то не так с поиском хранилища ключей.

Ответ №1:

Я понял это! Мне пришлось вызывать значения внутри KeyVault следующим образом:

  facebookOptions.AppId = Configuration["facebookID"];
                           facebookOptions.AppSecret = Configuration["FacebookSecret"];
  

Итак, мой класс работал не так, как предполагалось.