我有一个“ Internet 应用程序”-“一个默认的 ASP.NET MVC 3 项目,带有一个使用表单身份验证的帐户控制器。 ”称为MyMv3App。我使用 Ctrl + F5 在IIS Express中运行该站点,然后转到 localhost:10382/Account/Register 并创建一个用户“ test1 ”。创建用户后,我将被重定向到主页。我注销。然后我转到 localhost:10382/Account/LogOn 并输入用户“test1”的用户名和密码,然后单击“登录”按钮,用户就登录了。很酷,到目前为止一切正常!
接下来,我添加了一个新的C# “类库”项目并将其命名为MyCustomMembershipProvider。然后我从这里下载ProviderToolkitSamples.msi http://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspx,运行 msi 安装程序,然后转到文件夹C:\Program Files (x86 )\ASP.NET Provider Toolkit SQL Samples安装所有文件。然后,我将这些文件添加到我刚刚创建的 C# 类库项目 MyCustomMembershipProvider、SQLMembershipProvider.cs、SecUtil.cs、SqlConnectionHelper.cs和SR.cs. (我需要所有这些文件,否则 C# 类库项目 MyCustomMembershipProvider 将无法编译)。然后我向 C# 类库项目 MyCustomMembershipProvider添加对System.configuration、System.Web和System.Web.ApplicationServices的引用。然后我构建项目,然后我转到 MyMvc3App 并添加对 MyCustomMembershipProvider 项目的引用。
注意:忘了提到我将项目 MyCustomMembershipProvider 中所有四个文件的命名空间更改为“命名空间 MyCustomMembershipProvider”,并且我将类名重命名为 MyCustomMembershipProvider。而且在 SQLMembershipProvider.cs 第 110 行中,我将其从 name = "SqlMembershipProvider"; 更改为 名称 = "MyCustomMembershipProvider";
接下来我更改 web.config 文件成员资格部分:
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
对此:
<membership defaultProvider="MyCustomMembershipProvider">
<providers>
<clear/>
<add name="MyCustomMembershipProvider" type="MyCustomMembershipProvider.MyCustomMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
整个 web.config 现在看起来像这样:
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=152368
-->
<configuration>
<connectionStrings>
<add name="ApplicationServices"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="webpages:Version" value="1.0.0.0"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
<membership defaultProvider="MyCustomMembershipProvider">
<providers>
<clear/>
<add name="MyCustomMembershipProvider" type="MyCustomMembershipProvider.MyCustomMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
<profile>
<providers>
<clear/>
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
</providers>
</profile>
<roleManager enabled="false">
<providers>
<clear/>
<add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
</providers>
</roleManager>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages"/>
</namespaces>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
现在我做了与第一段完全相同的事情;我转到 localhost:10382/Account/Register 并创建一个用户,这次我将用户称为“ test2 ”。创建用户后,我将被重定向到主页。我注销。然后我去 localhost:10382/Account/LogOn 再次登录并输入用户“ test2 ”的用户名和密码,然后单击“登录”按钮,我收到错误消息:
登录失败。请更正错误并重试。提供的用户名或密码不正确。
为什么?我错过了什么?除了第110 行 SQLMembershipProvider.cs 中的命名空间和名称变量之外,我没有触及任何东西。
我试图理解为什么,所以我搜索了一下,发现添加 machineKey 元素可能有效。所以我去了这个网站http://www.developmentnow.com/articles/machinekey_generator.aspx并生成了一个 ASP.NET 2.0 machineKey 并将其复制粘贴到 web.config 的 system.web 元素中:
<machineKey
validationKey="A5E72C3BF96D34B9401278890361AA0949EAE806B124573AC3C1A8D77936B4E42BB1374D1DA443706C4E575B7F1234CB48F4CF52444CB4B1F343994752416569"
decryptionKey="47869B2D1F1D3EBC92FCC4C2D7B0EFB707535925E116AEF85F470E138A6C8CB5"
validation="SHA1" decryption="AES"
/>
我再次做了和以前一样的事情;我去 localhost:10382/Account/Register 并创建一个用户,这次我调用用户“ test3 ”。创建用户后,我将被重定向到主页。我注销。然后我转到 localhost:10382/Account/LogOn 并输入用户“ test3 ”的用户名和密码,然后单击“登录”按钮和 BAM!用户再次登录!?
为什么我必须在 web.config 中使用生成的验证密钥和解密密钥手动配置 machineKey,以便 MyCustomMembershipProvider 能够使用登录页面?据我所见,没有一篇文章/页面/博客谈到将 machineKey 元素添加到您的 web.config 以使您的自定义会员提供程序能够工作!
更新 1:添加 hashAlgorithmType="SHA1" 也可以:
<membership defaultProvider="MyCustomMembershipProvider" hashAlgorithmType="SHA1">
有趣的是,MSDN 说 SHA1 是默认值!?
hashAlgorithmType 可选字符串属性。指定用于散列密码值的加密算法的名称。此属性的值对应于 cryptoNameMapping 配置部分中 nameEntry 元素的 name 属性。有关指定自定义哈希算法的信息,请参阅将算法名称映射到加密类。 默认值为 SHA1。
更新 2:在阅读了 Microsoft 最新技术之后,我决定分享一些我发现的关于他们最新的会员资格提供商的发现;简单会员。我正处于我个人项目的阶段,我决定从我构建的 ASP.NET 2.0 天删除 CustomMembershipProvider 并改用 SimpleMembership 提供程序。为什么?好吧,您在 Jon Galloway 的以下博文中拥有您想知道的所有信息。我还添加了更多值得查看的资源链接。根据 Microsoft SimpleMembership 是 ASP.NET 2.0 Membership 的继承者。
http://mvccentral.net/Story/Details/tools/kahanu/securityguard-nuget-package-for-asp-net-membership
http://blog.osbornm.com/archive/2010/07/21/using-simplemembership-with-asp.net-webpages.aspx