brockallen.MembershipReboot 帐户确认无效
brockallen.MembershipReboot account confirmation not working
切入正题,而不是强迫任何人阅读冗长的解释,我知道 Microsoft 在其许多技术方面的安全默认设置存在问题。我使用 ASP.NET 和 MVC,实际上已经准备好使用 Microsoft 的默认设置(如 IdentityService)——并且正在研究它的更高级功能——这样我就可以掌握它们。但后来我偶然发现了 Brock Allen 的博客 post - 他在博客中解释说 Microsoft 在这些方面的默认设置还不够好。所以,这就是我发现他的 MembershipReboot 项目的地方。
我一直在实施这个库,起初并没有那么成功,但已经获得了关注,并取得了一些成功。我从它根本不起作用,到遇到问题。我修复了所有这些(在一点帮助下)。现在,登录和注册页面可以正常工作,注册和发送验证电子邮件也可以正常工作。这就是我现在被困的地方。收到验证邮件后,单击邮件中的 link - 我转到 localhost:####/ChangeEmail/(verification key) 页面 - 这就是我的新问题所在。我正在使用从 (SingleTenant) 示例代码中获取的一些代码。
当它转到该页面时,在默认设置中,它告诉我它有 "System.ArgumentException: account" 并且它指向 ChangeEmailController 的 Confirm ActionResult 中的代码 "if (account.HasPassword())"。我在该 ActionResult 中的 if 语句上方添加了一行代码 - "Redirect("http://" + account.Email);" - 只是看看它会用它做什么。加上那个,它给了我另一个(相关的)错误 - "Object reference not set to an instance of an object." 它指向我添加的确切代码。
所以,这真的让我很沮丧,很明显系统可以加载库,可以实际注册用户,可以发送带有正确验证密钥的电子邮件(我将它与数据库条目进行比较,它是相同的代码)。但是,当单击验证方法的 link 时 - 它似乎不想从数据库中检索相同的帐户数据。我觉得这很奇怪。
(请原谅我对导致我所问问题的实际答案的介绍略长,如果您不想阅读我如何到达的解释实际答案,然后跳过以下两段,并阅读接下来的第三段(及其下面的所有内容)-包含实际答案)
我还在图书馆的 GitHub(问题)页面上发布了这个问题。在这里(在 Whosebug 上)- 没有人能够提供任何建议。很好,因为图书馆的作者非常乐于助人。在与他交流之后,我们能够解决我的顾虑,并弄清楚是什么导致了手头的问题。
为了对图书馆和作者公平,错的不一定是图书馆本身。 more-so 事实是作者过着忙碌的生活(像我们大多数人一样),并且无法为所有类型的开发人员(包括那些可能不只是只需查看他的文档即可立即了解如何执行此操作——我在软件开发方面确实有相当多的经验(作为一种爱好),但我肯定仍在学习一些我需要知道的事情(我打算获得 Microsoft 证书,并正在学习))。
问题的实际答案: 基本上,事实证明,让我遇到这个问题的主要原因实际上是在处理验证密钥本身。我假设 - 就像许多图书馆一样,甚至可以在默认 ASP.NET 系统(包括微软提供的默认身份系统)中找到的东西 - 获取实际的验证密钥就像“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);
最后,我必须补充一点,作者非常乐于助人,他的图书馆绝对令人印象深刻。我让他在这里回答这个问题,他让我自己做,所以我就用他提供给我的信息在这里回答。
切入正题,而不是强迫任何人阅读冗长的解释,我知道 Microsoft 在其许多技术方面的安全默认设置存在问题。我使用 ASP.NET 和 MVC,实际上已经准备好使用 Microsoft 的默认设置(如 IdentityService)——并且正在研究它的更高级功能——这样我就可以掌握它们。但后来我偶然发现了 Brock Allen 的博客 post - 他在博客中解释说 Microsoft 在这些方面的默认设置还不够好。所以,这就是我发现他的 MembershipReboot 项目的地方。
我一直在实施这个库,起初并没有那么成功,但已经获得了关注,并取得了一些成功。我从它根本不起作用,到遇到问题。我修复了所有这些(在一点帮助下)。现在,登录和注册页面可以正常工作,注册和发送验证电子邮件也可以正常工作。这就是我现在被困的地方。收到验证邮件后,单击邮件中的 link - 我转到 localhost:####/ChangeEmail/(verification key) 页面 - 这就是我的新问题所在。我正在使用从 (SingleTenant) 示例代码中获取的一些代码。
当它转到该页面时,在默认设置中,它告诉我它有 "System.ArgumentException: account" 并且它指向 ChangeEmailController 的 Confirm ActionResult 中的代码 "if (account.HasPassword())"。我在该 ActionResult 中的 if 语句上方添加了一行代码 - "Redirect("http://" + account.Email);" - 只是看看它会用它做什么。加上那个,它给了我另一个(相关的)错误 - "Object reference not set to an instance of an object." 它指向我添加的确切代码。
所以,这真的让我很沮丧,很明显系统可以加载库,可以实际注册用户,可以发送带有正确验证密钥的电子邮件(我将它与数据库条目进行比较,它是相同的代码)。但是,当单击验证方法的 link 时 - 它似乎不想从数据库中检索相同的帐户数据。我觉得这很奇怪。
(请原谅我对导致我所问问题的实际答案的介绍略长,如果您不想阅读我如何到达的解释实际答案,然后跳过以下两段,并阅读接下来的第三段(及其下面的所有内容)-包含实际答案)
我还在图书馆的 GitHub(问题)页面上发布了这个问题。在这里(在 Whosebug 上)- 没有人能够提供任何建议。很好,因为图书馆的作者非常乐于助人。在与他交流之后,我们能够解决我的顾虑,并弄清楚是什么导致了手头的问题。
为了对图书馆和作者公平,错的不一定是图书馆本身。 more-so 事实是作者过着忙碌的生活(像我们大多数人一样),并且无法为所有类型的开发人员(包括那些可能不只是只需查看他的文档即可立即了解如何执行此操作——我在软件开发方面确实有相当多的经验(作为一种爱好),但我肯定仍在学习一些我需要知道的事情(我打算获得 Microsoft 证书,并正在学习))。
问题的实际答案: 基本上,事实证明,让我遇到这个问题的主要原因实际上是在处理验证密钥本身。我假设 - 就像许多图书馆一样,甚至可以在默认 ASP.NET 系统(包括微软提供的默认身份系统)中找到的东西 - 获取实际的验证密钥就像“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);
最后,我必须补充一点,作者非常乐于助人,他的图书馆绝对令人印象深刻。我让他在这里回答这个问题,他让我自己做,所以我就用他提供给我的信息在这里回答。