使用ASP.Net Membership Provider的MVC 3应用程序登录问题

3

我似乎遇到了一个不寻常的问题 -

我之前使用过aspnet成员资格提供程序,没有任何问题,但这次对我来说并不顺利。

我通过向导将模式添加到我的SQL服务器数据库中。为了首次使用配置应用程序,我运行一个脚本,该脚本填充数据库中的一些示例帐户、角色和其他信息。

在运行此脚本后,我可以使用新创建的用户名登录应用程序,使用功能等。然而,一段时间后,或者如果我从任务栏关闭开发服务器,然后再次启动应用程序并尝试登录 - 它将无法验证用户。它会失败第二个IF语句以验证下面的用户和密码。

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

如果我检查数据库,用户显然存在,但是不正确的密码尝试字段仍然为0,这可能表明应用程序甚至没有将其识别为用户。此外,如果我检查网站配置(VS2010->项目->ASP.NET配置),它显示有0个现有用户。
如果我重新运行应用程序,并再次运行安装脚本,我可以像以前一样登录,但是再次重新启动并尝试重新登录时会出现熟悉的错误密码/用户名屏幕。有时会发生在不同的端口号上,但有时端口号相同,仍然会发生。
以下是安装脚本:
 protected void btnSetUp_Click(object sender, EventArgs e)
        {
            ModelContainer ctn = new ModelContainer();

            Membership.ApplicationName = "MyApp";
            Roles.ApplicationName = "MyApp";

            if (!Roles.RoleExists("Administrator"))
                Roles.CreateRole("Administrator");

            if (!Roles.RoleExists("User"))
                Roles.CreateRole("User");

            // Delete all existing users.
            //
            foreach (MembershipUser user in Membership.GetAllUsers())
            {
                Membership.DeleteUser(user.UserName, true);
            }


            // Create the master admin account.
            //
            if (Membership.GetUser("admin@MyApp.com") == null)
            {
                MembershipUser adminUser = Membership.CreateUser("admin@MyApp.com", "admin123");
                Roles.AddUserToRole("admin@MyApp.com", "Administrator");
            }

            CreateUser(ctn, "User@MyApp.com", "Joe Bloggs", "Employee", 1);



            ctn.SaveChanges();
        }

        private void CreateUser(ModelContainer ctn, string emailAddress, string Name, string type, int baseShop)
        {
            // Create the User.
            //
            if (Membership.GetUser(emailAddress) == null)
            {
                MembershipUser adminUser = Membership.CreateUser(emailAddress, "admin123");
                Roles.AddUserToRole(emailAddress, "User");

                User u = new User
                {
                    Name = Name,
                    Type = type,
                    BaseShop = baseShop,
                    Login = new Guid(adminUser.ProviderUserKey.ToString())
                };

                ctn.AddToUsers(u);
            }

        }

我的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="ModelContainer" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=MyApp;User ID=**;Password=**;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
    <add name="ApplicationServices" connectionString="data source=localhost;initial catalog=MyApp;user id=**;password=**;" 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" />
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      </assemblies>
    </compilation>

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>

    <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>

    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="MyApp" />
      </providers>
    </profile>

    <roleManager enabled="true">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="MyApp" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="MyApp" />
      </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>

很难更详细地描述这个问题,但它令人困惑。在使用asp.net成员资格提供程序时,我是否错过了某个步骤?有其他人遇到过这种情况吗?
非常感谢任何建议。
1个回答

6
我认为问题出在你在设置代码中使用了自己定制的应用程序。
Membership.ApplicationName = "MyApp";
Roles.ApplicationName = "MyApp";

但是你的 web.config 文件使用了默认名称

applicationName="/"

啊,我现在明白了!我知道这一定是些傻瓜问题。非常感谢 :-) - 109221793

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接