为了切中要害,而不是强迫任何人阅读冗长的解释,我知道微软的安全缺省值在许多技术上都存在问题。我使用ASP.NET和MVC,实际上已经准备好使用微软的默认功能(比如IdentityService) --并且正在研究它更高级的特性--这样我就可以掌握它们了。但后来我无意中发现了布罗克·艾伦的博文--他解释说,微软在这些方面的违约还不够好。所以,这就是我发现他的MembershipReboot项目的地方。
我一直在实现这个库的过程中,一开始没有那么多的成功,但已经获得了吸引力,并取得了一些成功。我从根本不起作用到出了问题。我(在一点帮助下)解决了所有这些问题。现在,登录和注册页面工作,注册工作以及发送验证电子邮件,他们都工作。我现在被困在这里了。收到验证邮件后,单击电子邮件中的链接--我转到本地主机:#/ChangeEmail/(验证键)页面--这就是我的新问题所在。我正在使用(SingleTenant)示例代码中的一些代码。
当它进入该页面时,在默认设置中,它告诉我它有"System.ArgumentException: account“,并指向ChangeEmailController的确认ActionResult中的代码"if (account.HasPassword())”。我在if语句的上面添加了一行代码--“http://”+account.Email;“--只是为了看看它会做些什么。通过添加,它给了我另一个(相关的)错误--“对象引用没有设置为对象的实例”。它指向了我添加的那个确切的代码。
所以,这真的让我很沮丧,很明显,系统在加载库时起作用,它能够实际注册用户,能够用正确的验证键发送电子邮件(我将它与数据库条目进行比较,代码是相同的)。但是,当点击到验证方法的链接时--它似乎不想从数据库中检索相同的帐户数据。我觉得这很奇怪。
发布于 2016-01-25 23:10:24
(请原谅我对我所问问题的实际答案作了稍长的介绍,如果你不愿意阅读我如何得到实际答案的解释,那么跳过以下两段,阅读下面的第三段(及其下面的所有内容)-其中包含了实际的答案。
我还在图书馆的GitHub (问题)页面上发布了这个问题。在这里(堆叠溢出)-没有人能够提供任何建议。这很好,因为图书馆的作者很有帮助。在与他交流了几次之后,我们能够解决我的担忧,并弄清楚是什么导致了眼前的问题。
公平地说,图书馆和作者不一定是图书馆本身的错。事实上,作者过着忙碌的生活(就像我们大多数人一样),并且无法为所有领域的开发人员(包括那些可能仅仅通过查看他的文档就能立即理解如何做到这一点的人)编写一份非常深入的文档--我确实在软件开发方面有相当丰富的经验(作为一种爱好),但我肯定还在学习一些我需要知道的东西(我打算获得微软证书,并正在研究它)。
这个问题的实际答案是:基本上是这样说的,结果就是,我遇到这个问题的主要原因是处理验证密钥本身。和许多库一样,甚至在默认的ASP.NET系统(包括微软提供的默认身份系统)中,我都认为获得实际的验证密钥就像"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 config中:
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);最后,我必须补充说,作者非常有帮助,他的图书馆肯定是令人印象深刻的。我让他在这里回答这个问题,他让我自己去做,所以我用他提供给我的信息回答了这个问题。
https://stackoverflow.com/questions/34459825
复制相似问题