使用MVC2中的成员资格提供程序和MySQL

时间:2011-02-11 14:55:52

标签: mysql asp.net-mvc-2 membership

我在这个论坛上看了几篇关于这个的帖子,但似乎没什么用。我正在尝试使用最新版本的连接器(6.3.6.0)和VS2010替换默认的基于SQL Server的提供程序与MySQL提供程序,但在访问WSAT中的安全性部分时我一直收到错误。以下是我的步骤:

1)创建一个新的mysql数据库。 2)创建一个新的MVC2应用程序。 3)更改web.config如下:

    <connectionStrings>
     <remove name="LocalMySqlServer"/>
     <add name="LocalMySqlServer"
      connectionString="Data Source=127.0.0.1;Port=3306;Database=Sample;User id=root;Password=mysql;"
      providerName="MySql.Data.MySqlClient"/>
     <remove name="ApplicationServices"/>
     <add name="ApplicationServices"
      connectionString="Data Source=127.0.0.1;Port=3306;Database=Sample;User id=root;Password=mysql;"
       providerName="MySql.Data.MySqlClient" />
    </connectionStrings>
    ...
    <membership defaultProvider="MySqlMembershipProvider">
     <providers>
     <clear/>
     <add name="MySqlMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider,MySql.Web,Version=6.3.6.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
     connectionStringName="MySqlMembershipConnection"
     enablePasswordRetrieval="false"
     enablePasswordReset="true"
     requiresQuestionAndAnswer="false"
     requiresUniqueEmail="true"
     passwordFormat="Hashed"
     maxInvalidPasswordAttempts="5"
     minRequiredPasswordLength="6"
     minRequiredNonalphanumericCharacters="0"
     passwordAttemptWindow="10"
     applicationName="/"
     autogenerateschema="true"/>
    </providers>
    </membership>

<profile>
 <providers>
 <clear/>
 <add type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"
         name="MySqlProfileProvider"
         applicationName="/"
         connectionStringName="MySqlMembershipConnection"
         autogenerateschema="true"/>
 </providers>
</profile>

<roleManager enabled="true" defaultProvider="MySqlRoleProvider">
 <providers>
 <clear />
 <add connectionStringName="MySqlMembershipConnection"
  applicationName="/"
  name="MySqlRoleProvider"
  type="MySql.Web.Security.MySQLRoleProvider,MySql.Web,Version=6.3.6.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
  autogenerateschema="true"/>
 </providers>
</roleManager>

<machineKey validationKey="AutoGenerate" validation="SHA1"/>

当我运行WSAT并单击安全性时,我收到此错误:

  

您选择的数据存储存在问题。这可以   由无效的服务器名称或   凭证,或不足   允许。它也可能是由   角色管理器功能不存在   启用。点击下面的按钮即可   重定向到您可以的页面   选择一个新的数据存储。

     

以下消息可能对您有所帮助   诊断问题:来源是   找不到,但部分或全部事件日志   无法搜索。创造   来源,你需要阅读权限   所有事件日志,以确保   新的源名称是唯一的。   无法访问的日志:安全性。

有人能告诉我这个程序有什么问题吗?谢谢大家!

2 个答案:

答案 0 :(得分:1)

最后我得到了它的工作,我想在这里分享这些信息。我在ASP.NET MVC 2网站中使用最新版本的Connector / Net(6.3.6)。这是我做的:

1)创建一个新的MySql数据库(或者只使用你的数据库)。

2)确保您的machine.config已启用MySQLMembershpProvider的架构自动生成。您可能知道,machine.config通常位于c:\ windows \ microsoft.net \ framework [version] \ config \ machine.config下。在MySQLMembershipProvider的条目下找到并将属性autogenerateschema =“true”附加到元素。整个元素将如下所示:

<add name="MySQLMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Clear" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" autogenerateschema="true"/>

3)在你的web.config中(我指的是一个新创建的Web应用程序,如果需要,可以进行更改)更改连接字符串和提供程序,以便它们引用MySql。通常:在connectionStrings下添加:

<remove name="ApplicationServices"/>
<add name="ApplicationServices" connectionString=connectionString="server=YOURSERVER;UserId=YOURUSER;password=YOURPASSWORD;Persist Security Info=True;database=YOURDATABASE;charset=utf8" providerName="MySql.Data.MySqlClient"/>

(顺便说一下,请注意连接字符串中的charset = utf8:这不是成员资格所必需的,但是如果要使用此连接字符串来交换Unicode数据则需要它:仅仅定义字符是不够的在MySql表字段中设置!)。

此外,在成员资格/提供者下...确保成员资格提供程序元素(通常类似于add name =“AspNetSqlMembershipProvider”...)connectionStringName属性是指您在上面设置的连接字符串(在我的情况下,connectionStringName =“ ApplicationServices“)。对profile和roleManager提供程序执行相同操作,它们应如下所示:


<profile>
  <providers>
    <clear/>
    <add type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"
         name="AspNetSqlProfileProvider"
         applicationName="/"
         connectionStringName="ApplicationServices"
         autogenerateschema="true"/>
  </providers>
</profile>
<roleManager enabled="true" defaultProvider="MySqlRoleProvider">
  <providers>
    <clear />
    <add connectionStringName="ApplicationServices"
         applicationName="/"
         name="MySqlRoleProvider"
         type="MySql.Web.Security.MySQLRoleProvider,MySql.Web,Version=6.3.6.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
         autogenerateschema="true"/>
  </providers>
</roleManager>
<machineKey validationKey="AutoGenerate" validation="SHA1"/>

(注意SHA1验证!)。

4)从Visual Studio启动WSAT并让它配置你的MySql数据库。它应该创建所需的所有表,并允许您创建用户和分配角色。小心表名称套管!使用像myaspnet_Users(而不是myaspnet_users)这样的WSAT表,这可能会导致混淆(MySQL Workbench似乎对此感到困惑,如果你有2个表,它们的名称只是通过大小写区别而只显示1个表。像Navicat这样的工具在这方面似乎更聪明)。最好让WSAT创建表来避免这种麻烦。

最后,请记住,如果要在某些关系中使用my_aspnet ...表,则必须确保选择正确的MySQL数据库引擎,即不是MyISAM而是InnoDB,否则即使设置了外键也会被忽略

我可以分享这个问题。希望这可能会为其他人节省一些时间......

答案 1 :(得分:0)

也许我找到了罪魁祸首:我今天工作的PC没有自己的machine.config(for .net 4)配置为autogenerateschema =“true”(顺便说一下上面我的代码中有一个拼写错误,连接字符串名称是不正确的,但这只发生在我的帖子中的复制/粘贴)。所以这可能对像我这样的所有新手都很有用:记得设置autogenerateschema =“true”

无论如何,谢谢