【问题标题】:brockallen.MembershipReboot account confirmation not workingbrockallen.MembershipReboot 帐户确认不起作用
【发布时间】:2016-03-31 07:31:55
【问题描述】:

为了切入正题,而不是强迫任何人阅读冗长的解释,我知道在涉及到许多技术时,Microsoft 的安全默认设置存在问题。我使用 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);" - 只是看看它会做什么。添加后,它给了我另一个(相关的)错误 - “对象引用未设置为对象的实例。”它指向了我添加的确切代码。

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

【问题讨论】:

  • 您应该发布您的代码,以便我们告诉您问题出在哪里

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


【解决方案1】:

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

我还在图书馆的 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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多