brockallen.MembershipReboot帐户确认无效

时间:2015-12-25 03:40:27

标签: entity-framework security asp.net-mvc-5 membershipreboot

为了达到目的,并没有强迫任何人阅读冗长的解释,我已经知道微软的许多技术存在安全默认问题。我使用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);” - 只是看看它会用它做什么。通过这个添加,它给了我另一个(相关的)错误 - “对象引用未设置为对象的实例”。它指出了我添加的确切代码。

所以,它真的让我感到沮丧,显然系统在加载库时起作用,它能够实际注册用户,它能够发送带有正确验证密钥的电子邮件(我对它进行了比较)到数据库条目,它是相同的代码)。但是,当点击验证方法的链接时 - 它似乎不想从数据库中检索相同的帐户数据。我发现这很奇怪。

1 个答案:

答案 0 :(得分:0)

(请原谅我稍微介绍一下我所询问的问题的实际答案是什么,如果你不小心阅读我如何达到实际问题的解释回答,然后跳过以下两段,并阅读以下第三段(及其下面的所有内容) - 其中包含实际答案

我还在图书馆的GitHub(问题)页面上发布了这个问题。在这里(在stackoverflow上) - 没有人能够提供任何建议。没关系,因为图书馆的作者非常乐于助人。经过与他的一些来回,我们能够解决我的担忧,并找出导致问题的原因。

为了公平对待图书馆和作者,图书馆本身并不一定是错的。事实上,作者过着忙碌的生活(就像我们大多数人一样),并且无法为所有条纹的开发人员(包括那些可能不会立即理解的人)编写一份非常深入的文档。如何通过查看他的文档来做到这一点 - 我在软件开发方面有很多经验(作为一种爱好),但我仍然在学习一些我需要知道的事情(我打算得到一个)微软证书,我正在为它学习))。

问题的实际答案: 基本上,事实证明,让我解决这个问题的主要原因是真正处理验证密钥本身。我假设 - 就像许多库一样,甚至可以在默认的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&#34;

正如我所说 - 他确实说他的文件确实提到了这一点,只是它并不是很清楚。一旦他向我透露了这一点,我就回到他的文档中,我发现 - 实现var&#34; config&#34; (他在我刚刚引用的答案中描述过) - 必须像DI一样用DI来完成,如下所示:

kernel.Bind<MembershipRebootConfiguration>().ToConstant(config);

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