#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"];
Итак, мой класс работал не так, как предполагалось.