ASP.net MVC 4用户和角色管理(“Membership.Provider”属性必须是“ExtendedMembershipProvider”的实例。)

16

我已经试了两天,但迄今为止毫无进展。我需要管理用户及其角色,没有其他的需求。

我尝试理解如何在MVC中实现它,但无论在互联网上还是在任何MVC 4书籍中都找不到详细的教程。

我首先使用aspnet_regsql实用程序启用了aspnet数据库,创建了这些表:

Tables added by aspnet_regsql

这是我在教程中找到的全部内容,它并未显示如何与这些表进行交互(我假设是使用默认成员资格提供程序),到目前为止,我发现有三种主要方法可以实现这一点:

  • 默认成员资格提供程序(我对此一无所知)
  • 通用提供程序
  • SimpleMembership

我找到了这个教程:

http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-7

这里要求创建一个带有Internet应用程序模板的新MVC 4应用程序项目,并复制所有与帐户控件相关的文件。

我为我的项目做到了这一点,但是一旦尝试登录,我就会收到以下错误:

To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider".

根据这个论坛: http://social.msdn.microsoft.com/Forums/en-US/windowsazuredevelopment/thread/d352bb1b-577c-42b7-8872-5ed59cd65f32/,这是由于我在web.config文件中定义的配置文件中如何定义profile、membership和roleManager提供程序。

<profile>
  <providers>
    <clear />
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="DatabaseConnection" applicationName="/" />
  </providers>
</profile>
<membership>
  <providers>
    <clear />
    <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="DatabaseConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
  </providers>
</membership>
<roleManager enabled="true">
  <providers>
    <clear />
    <add connectionStringName="DatabaseConnection" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
    <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" />
  </providers>
</roleManager>

我只需要能够添加新用户,为他们分配角色,并根据访问视图的角色显示不同的内容。

问题 #1 使用Internet应用程序模板创建MVC 4应用程序时使用了哪个成员资格提供程序?

问题 #2

我在web.config文件中做错了什么?如何正确定义提供程序?

问题 #3

哪个选项更适合我?如果您知道一个很好的教程,请给我提供链接吗?

非常感谢任何帮助!先感谢您!


2
你看过ASP.NET简单成员资格吗?这是一个很好的起点:http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx - Floremin
我刚刚注意到我的控制器类有一个[InitializeSimpleMembership],它明确说明我正在使用simplemembership。在你发送给我的链接中,他们展示了web.config文件如何定义提供程序,我只是将这些添加到我的web.config中,但是当我登录时,我仍然得到相同的错误:“调用此方法时,“Membership.Provider”属性必须是“ExtendedMembershipProvider”的实例。”我做错了什么? - oskar132
1
你尝试过使用简单成员身份验证(Simple Membership)开始“清洁”的工作吗?这个主题可能会有所帮助:https://dev59.com/1mYr5IYBdhLWcg3w495- - Floremin
当用户/会员需求简单时,我通常自己实现。 - Floremin
这是我的第一个专业网络应用程序,我非常关注安全性,但对此并没有深入的了解。自己实现是否存在风险?不使用微软等公司提供的选项似乎是一个很大的折衷。这只是我的观点,你认为呢? - oskar132
3个回答

4
您正在使用的会员提供程序已过时。新的通用会员提供程序使用不带前缀aspnet_的新表名称。
1)请查看Scott Hanselman的链接。
2)如果您不使用它,则不需要profileroleManager配置不正确。
FYI:请在web.config中明确定义machineKey,这将为您节省很多麻烦。
P.S. 我同意您的观点。我刚刚读完Adam Freeman的Pro ASP.NET MVC 4;他没有提到Membership Provider。如果您想阅读,Jamie Kurtz的ASP.NET MVC 4和Web API使用旧版Membership Provider。

请问您能具体说明一下机器密钥是用来做什么的吗?感谢您的回复! - oskar132
1
如果密码被加密或散列,Membership提供程序将使用machineKey来生成它。如果您将应用程序移动到不同的服务器,则现有用户无法登录,除非明确定义了machineKey - Win

1

ASP.Net中的会员资格和安全性非常复杂,而在ASP.NET MVC中仍然很复杂。但幸运的是,完全可以不使用内置的会员资格。我已经创建了一个简单的解决方案并在许多项目中使用它,现在已将其添加到github,请参见http://github.com/TesserisPro/ASP.NET-SImple-Security-Provider,您可以轻松自定义它。


非常感谢,我会看一下的。不过我注意到新的MVC 5已经更改了成员组件,似乎更加易于使用,你有见过吗? - oskar132
是的,我有。有WebMatrix提供程序和OWIN提供程序。如果您正在从MVC4迁移到MVC5,则需要花费一小时或更长时间来处理这些事情及其依赖项,因为它们对于简单的事情仍然过于复杂。这就是为什么我创建了这个。它只提供用户登录功能和非常简单的角色,并且不依赖于太空船。 - Dmitry
@Dmitry,你的示例项目中所有内容都保存在一个表格中。这是一个适用于小型应用程序的好模板。 - JoshYates1980

1
问题 #1 如果我使用互联网应用程序模板创建MVC 4应用程序,将使用哪个成员资格提供程序?
答案:SimpleMembershipProvider 问题 #2 我在web.config文件中做错了什么?如何正确定义提供程序?
答案:对于SimpleMembershipProvider,不需要修改web.config文件。有关详细的配置/设置信息和教程,请参见此处:http://aaron-hoffman.blogspot.com/2013/02/aspnet-mvc-4-membership-users-passwords.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接