brockallen.MembershipReboot подтверждение аккаунта не работает
Чтобы понять, и не заставлять никого читать длинное объяснение, я знаю, что существуют проблемы с настройками безопасности Microsoft по умолчанию, когда речь идет о многих из ее технологий. Я использую ASP.NET и MVC, и фактически был готов использовать настройки по умолчанию Microsoft (например, IdentityService) - и искал его более продвинутые функции - так что я могу освоить их. Но потом я наткнулся на сообщение в блоге Брока Аллена - где он объяснил, что дефолты Microsoft в этих отношениях просто недостаточно хороши. Вот где я узнал о его проекте MembershipReboot.
Я был в процессе реализации этой библиотеки, поначалу с не таким большим успехом, но набирал обороты и добился определенного успеха. Я пошел от этого, не работая вообще, чтобы иметь проблемы ди. Я исправил все это (с небольшой помощью). Теперь страницы входа и регистрации работают, и регистрация работает так же, как и отправка проверочных писем, все они работают. Вот где я сейчас застрял. После получения письма с подтверждением и перехода по ссылке в письме, я перехожу на страницу localhost:####/ChangeEmail/(ключ подтверждения) - и здесь моя новая проблема. Я использую часть кода, взятого из примера кода (SingleTenant).
Когда он перешел на эту страницу, в настройках по умолчанию он сказал мне, что у него есть "System.ArgumentException: account", и он указал на код "if (account.HasPassword())" в Confirm ActionResult ChangeEmailController. Я добавил строку кода выше, что оператор if в этом ActionResult - "Redirect("http://" + account.Email);" - просто чтобы посмотреть, что с этим делать. С этим добавлением он дал мне еще одну (связанную) ошибку - "Ссылка на объект не установлена на экземпляр объекта". и это указало на тот точный код, который я добавил.
Таким образом, это действительно расстраивает меня, очевидно, что система работает с загрузкой библиотеки, работает с возможностью фактической регистрации пользователя, с возможностью отправки электронного письма с правильным ключом проверки (я сравнил его с базой данных). запись, это был тот же код). Но затем, когда щелкают ссылку на метод проверки, кажется, что он не хочет получать те же данные учетной записи из базы данных. Я нахожу это довольно странным.
1 ответ
(Пожалуйста, извините меня за мое немного длинное введение в то, что приводит к фактическому ответу на вопрос, о котором я спрашивал, если вы не хотите прочитать объяснение того, как я добрался до фактического ответа, тогда пропустите следующие два параграфа и прочитайте третий следующий абзац (и все, что под ним) - который содержит фактический ответ)
Я также разместил этот вопрос на странице библиотеки GitHub (проблемы). Здесь (на stackru) - никто не смог предоставить никаких предложений. Это хорошо, потому что автор библиотеки был очень полезным. После нескольких встреч с ним мы смогли решить мои проблемы и выяснить, что же вызвало возникшую проблему.
Чтобы быть справедливым по отношению к библиотеке и автору, не обязательно сама библиотека была виновата. Тем более, что автор живет напряженной жизнью (как и большинство из нас) и не смог написать очень подробную документацию для разработчиков всех мастей (включая тех, кто не сразу понимает, как сделать это, просто взглянув на его документацию - у меня достаточно опыта в разработке программного обеспечения (в качестве хобби), но я определенно все еще нахожусь в стадии изучения некоторых вещей, которые мне нужно знать (я намерен получить сертификат Microsoft Учусь за это)).
Фактический ответ на вопрос: в сущности, как оказалось, главное, что привело меня к этой проблеме, было действительно иметь дело с самим ключом проверки. Я предположил - как и во многих библиотеках и даже в том, что можно найти в системе ASP.NET по умолчанию (включая систему удостоверений по умолчанию, предоставляемую Microsoft), - что получение фактического ключа подтверждения было сделано как " var key = account.VerificationKey; " - но автор библиотеки показал мне, что нужно получить правильный ключ проверки, который на самом деле связан с создаваемой учетной записью (кстати, его система включает в себя расширенную форму хеширования (довольно впечатляюще)) - мне пришлось использовать событие Система обработки - потому что его библиотека использует систему "Event Bus". У меня есть некоторые знания в WebForms, и я чувствую себя комфортно с MVC. Я понимаю C# и многие из его функциональных возможностей в достаточной степени, но это может слегка смущать, но у меня никогда (до этого) не было опыта работы с обработкой событий - и на самом деле я рад, что эта библиотека привела меня к некоторому изучению этого. Вот что автор сказал о том, как это сделать (и другие связанные с его работой вещи могут быть выполнены аналогичным образом):
"Что-то вроде этого:
public class CustomEmailEventHandler : IEventHandler<AccountCreatedEvent<UserAccount>>
{
public void Handle(AccountCreatedEvent<UserAccount> evt)
{
// send evt.VerificationKey to evt.Account.Email
}
}
и затем зарегистрируйте его в конфигурации MR:
var config = new MembershipRebootConfiguration();
config.AddEventHandler(new CustomEmailEventHandler());
Это примерно так. Вам нужно будет реализовать дополнительный IEventHandler для других событий, о которых вы заботитесь, здесь: https://github.com/brockallen/BrockAllen.MembershipReboot/blob/master/src/BrockAllen.MembershipReboot/AccountService/UserAccountEvents.cs "
Как я уже сказал, он сказал, что в его документации упоминается об этом, просто не совсем понятно. Как только он открыл мне это, я вернулся к его документации и выяснил - для реализации var "config" (которую он описал в ответе, который я только что процитировал) - это должно быть сделано с DI, как Ninject, примерно так:
kernel.Bind<MembershipRebootConfiguration>().ToConstant(config);
Наконец, я должен добавить, что автор был очень полезным, и его библиотека, безусловно, впечатляет. Я попросил его ответить на этот вопрос здесь, и он сказал мне идти вперед и сделать это самостоятельно, поэтому я ответил здесь, используя информацию, которую он мне предоставил.