2012-10-10 62 views
2

我正在使用ASP.net MVC4模板的内置SimpleMembership,并且想要创建管理面板来重置用户基上的密码和类似操作。MVC4中的SimpleMembershipProvider在初始化时在方法上抛出NotSupportedException

我正在使用SecurityGuard.MVC4 nuget作为起点,并在大多数操作中获取NotSupportedException。 SecurityGuard使用控制器的Membership属性来调用SimpleMembershipProvider上的GetAllUsers(),GetUser()和ResetPassword()等方法,并且它们都抛出NotSupportedException异常。从技术文档似乎这是由设计:

SimpleMembershipProvider.GetAllUsers

注意:如果SimpleMembershipProvider类已使用 到WebSecurity.InitializeDatabaseConnection()方法的调用初始化,不支持此 方法会抛出一个NotSupportedException异常 。但是,如果尚未调用WebSecurity.InitializeDatabaseConnection() 方法,并且您已将站点配置为 ,则使用标准ASP.NET成员资格提供程序,则此方法将通过 传递给标准成员资格提供程序。

我错过了什么?看起来我需要选择使用WebSecurity作为WebSecurity.CreateUser()之类的标准工具,并直接使用提供者?

我可以解决这个问题,但我主要困惑为什么我不能同时得到这两个?

回答

6

SimpleMembership被故意设计成..好,简单。 WebSecurity使用SimpleMembership,并使用SimpleMembership来源的ExtendedMembershipProvider类。

基本上,SimpleMembership不会实现WebSecurity中不存在的任何函数,而GetAllUsers就是其中之一。是的,这是设计。

你有几种选择。所有这些都是解决方法。

  1. 你可以简单地做你自己的查询来获取所有用户。
  2. 您可以从SimpleMembership得出自己的会员提供和实现这些功能
  3. 你可以回去的SqlMembershipProvider(或通用提供商)(但避开WebSecurity)
+0

感谢您的澄清和选项解决它。我可能会派生自己的会员供应商。担心滚动我自己会引入安全问题。 – angularsen

+0

我仔细查看了SimpleMembershipProvider的反编译代码和文档,发现如果未初始化,它将回退到使用PreviousProvider属性。这基本上是任何传递给它的构造函数的提供者,不确定在Web.Config中定义的默认提供者是如何工作的。无论哪种方式,SimpleMP都没有实现这些东西,它只是回退到“前一个”提供者,如果它没有被初始化,并且没有回退没有别的选择,而是抛出NotSupportedException。我想这就是这个倒退让我困惑的第一个地方。 – angularsen

+0

@AndreasLarsen - 如果您没有初始化SimpleMembership,那么您无法使用WebSecurity。它会抛出一个异常。 SimpleMembership不会在Web.Config中配置,而是通过放置在AccountController上的属性进行配置。这会覆盖web.config中定义的成员资格,因此如果您不初始化SimpleMembership,它将使用web.config中配置的任何内容。 –

相关问题