提供的用户名或密码不正确。在MVC 3 Internet应用程序中

时间:2012-01-22 23:00:28

标签: asp.net-mvc-3 membership membership-provider custom-membershipprovider machinekey

我有一个" 互联网应用" - " 一个默认的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://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/initializesimplemembership-attribute-and-simplemembership-exceptions.aspx

0 个答案:

没有答案