0

切入正题,而不是强迫任何人阅读冗长的解释,我知道微软在其许多技术方面的安全默认设置存在问题。我使用 ASP.NET 和 MVC,实际上已经准备好使用 Microsoft 的默认设置(如 IdentityService)——并且正在研究它的更高级功能——所以我可以掌握它们。但后来我偶然发现了 Brock Allen 的博客文章——他解释说微软在这些方面的默认设置还不够好。所以,这就是我发现他的 MembershipReboot 项目的地方。

我一直在实现这个库,起初并没有那么成功,但已经获得了牵引力,并且取得了一些成功。我从根本不工作到遇到问题。我修复了所有这些(在一些帮助下)。现在,登录和注册页面工作,注册工作以及发送验证电子邮件,它们都工作。这就是我现在所困的地方。收到验证电子邮件后,单击电子邮件中的链接 - 我转到 localhost:####/ChangeEmail/(验证密钥) 页面 - 这就是我的新问题所在。我正在使用从 (SingleTenant) 示例代码中获取的一些代码。

当它进入该页面时,在默认设置中,它告诉我它有“System.ArgumentException:account”,它指向 ChangeEmailController 的 Confirm ActionResult 中的代码“if (account.HasPassword())”。我在该 ActionResult 中的 if 语句上方添加了一行代码 - “Redirect("http://" + account.Email);" - 只是看看它会做什么。加上那个,它给了我另一个(相关的)错误 - “对象引用未设置为对象的实例。” 它指向了我添加的确切代码。

所以,这真的让我很沮丧,很明显系统可以加载库,可以实际注册用户,可以使用正确的验证密钥发送电子邮件(我将它与数据库进行了比较条目,它是相同的代码)。但是,当点击验证方法的链接时 - 它似乎不想从数据库中检索相同的帐户数据。我觉得这很奇怪。

4

1 回答 1

0

(请原谅我稍微冗长地介绍了导致我所问问题的实际答案的原因,如果您不想阅读关于我如何得到实际答案的解释,请跳过以下两段,并阅读下面的第三段(以及它下面的所有内容) - 其中包含实际答案

我还在图书馆的 GitHub(问题)页面上发布了这个问题。在这里(在 stackoverflow 上) - 没有人能够提供任何建议。很好,因为图书馆的作者非常乐于助人。在与他反复讨论之后,我们能够解决我的担忧,并弄清楚是什么导致了手头的问题。

为了对图书馆和作者公平起见,错的不一定是图书馆本身。更重要的是,作者过着忙碌的生活(就像我们大多数人一样),并且无法为所有类型的开发人员(包括那些可能无法立即理解如何只是通过查看他的文档来做到这一点 - 我确实在软件开发方面有相当多的经验(作为一种爱好),但我肯定还在学习一些我需要知道的东西(我打算获得 Microsoft 证书,并且正在为此学习))。

问题的实际答案:基本上,事实证明,让我遇到这个问题的主要因素实际上是处理验证密钥本身。我假设 - 与许多库一样,甚至可以在默认 ASP.NET 系统(包括 Microsoft 提供的默认身份系统)中找到的内容 - 获取实际验证密钥就像“ var key = account.VerificationKey;“ - 但是图书馆的作者向我透露,要获得与正在创建的帐户相关联的正确验证密钥(顺便说一下,他的系统包括一种高级形式的哈希(非常令人印象深刻)) - 我不得不使用一个事件处理系统 - 因为他的库使用“事件总线”系统。我在 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);

最后,我必须补充一点,作者非常乐于助人,他的图书馆绝对令人印象深刻。我让他在这里回答这个问题,他告诉我继续自己做,所以我用他提供给我的信息在这里回答。

于 2016-01-25T23:10:24.950 回答