我有一个" 互联网应用" - " 一个默认的ASP.NET MVC 3项目,其中包含一个使用表单身份验证的帐户控制器。"名为 MyMv3App 。我使用Ctrl + F5在 IIS Express 中运行该网站,然后我转到localhost:10382 /帐户/注册,我创建了一个用户" test1 &#34 ;。创建用户后,我将重定向到主页。我退出了。然后我转到localhost:10382 / Account / LogOn并输入用户的用户名和密码" test1"并点击"登录"按钮和用户已登录。很酷,到目前为止一切正常!
接下来,我添加一个新的 C#" 类库"项目,我将其命名为 MyCustomMembershipProvider 。然后我从这里http://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspx下载 ProviderToolkitSamples.msi ,运行msi安装程序,然后转到文件夹 C:\ Program Files(x86)\ ASP.NET Provider Toolkit SQL样本,其中安装了所有文件。然后我将这些文件添加到我刚刚创建的C#类库项目MyCustomMembershipProvider, SQLMembershipProvider.cs , SecUtil.cs , SqlConnectionHelper.cs 和 SR.cs 即可。 (我需要所有这些文件或C#类库项目MyCustomMembershipProvider不会编译)。然后,我将对 System.configuration , System.Web 和 System.Web.ApplicationServices 的引用添加到C#类库项目MyCustomMembershipProvider。然后我构建项目,然后我去MyMvc3App和 我添加了对MyCustomMembershipProvider项目的引用。
注意:忘记提及我更改了项目中所有四个文件的命名空间 MyCustomMembershipProvider to" namespace MyCustomMembershipProvider"我还将类名重命名为MyCustomMembershipProvider。并且在SQLMembershipProvider.cs第110行中,我将其从name =" SqlMembershipProvider"; to name =" MyCustomMembershipProvider&#34 ;;
接下来,我从此处更改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 /帐户/注册我创建一个用户,这次我打电话给用户 &#34;的 TEST2 &#34 ;.创建用户后,我将重定向到主页。我退出了。然后我去 localhost:10382 /帐户/登录再次登录并输入用户的用户名和密码&#34; test2 &#34;并点击&#34;登录&#34;按钮,我收到错误消息:
登录失败。请更正错误,然后重试。 提供的用户名或密码不正确。
为什么呢?我错过了什么?除了命名空间之外,我还没有触及到第110行的SQLMembershipProvider.cs中的 name 变量。
我试着理解为什么所以我用Google搜索并发现添加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 /帐户/注册我创建了一个用户,我正在呼叫用户&#34; test3 &#34;这次。创建用户后,我将重定向到主页。我退出了。然后我转到localhost:10382 / Account / LogOn并输入用户的用户名和密码&#34; test3 &#34;并点击&#34;登录&#34;按钮和BAM!用户再次登录!?
为什么我必须在web.config中为生成的validationKey和decryptionKey手动配置machineKey,以便MyCustomMembershipProvider能够使用登录页面?据我所知,没有一篇文章/页面/博客谈论将webKey元素添加到web.config中,以便您的自定义成员资格提供者能够工作!
UPDATE 1 :添加hashAlgorithmType =&#34; SHA1&#34;同样有效:
<membership defaultProvider="MyCustomMembershipProvider" hashAlgorithmType="SHA1">
有趣的是,MSDN说SHA1是默认的!?
hashAlgorithmType 可选的String属性。 指定用于散列密码值的加密算法的名称。 此属性的值对应于cryptoNameMapping配置节中nameEntry元素的name属性。有关指定自定义哈希算法的信息,请参阅将算法名称映射到加密类。 默认值为SHA1 。
更新2 : 在阅读微软最新技术后,我决定分享一些我发现的最新Mebership提供商的发现; SimpleMembership。我正处于个人项目的阶段,我决定从我构建的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