0

我有一个“ 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.csSecUtil.csSqlConnectionHelper.csSR.cs. (我需要所有这些文件,否则 C# 类库项目 MyCustomMembershipProvider 将无法编译)。然后我向 C# 类库项目 MyCustomMembershipProvider添加对System.configurationSystem.WebSystem.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://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

http://mvccentral.net/Story/Details/tools/kahanu/securityguard-nuget-package-for-asp-net-membership

http://blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/

http://blog.osbornm.com/archive/2010/07/21/using-simplemembership-with-asp.net-webpages.aspx

http://blogs.msdn.com/b/rickandy/archive/2012/08/15/initializessimplemembership-attribute-and-simplemembership-exceptions.aspx

4

0 回答 0