繁体   English   中英

使用ASP.Net成员资格提供程序登录问题的MVC 3应用程序

[英]MVC 3 Application With ASP.Net Membership Provider Login Issue

我似乎有一个不寻常的问题 -

我以前使用过aspnet成员资格提供程序没有任何问题,但这对我来说不合适。

我已经通过向导将模式添加到sql server上的数据库中。 要配置首次使用的应用程序,我运行一个脚本,用一些示例帐户,角色和其他信息填充数据库。

运行此脚本后,我可以使用新创建的用户名登录应用程序,使用功能等。但过了一段时间,或者如果我从任务栏关闭开发服务器,然后再次启动应用程序并尝试登录 - 它不会验证用户。 它使第二个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会员提供商时是否错过了一个步骤? 有没有其他人遇到过这个?

对任何建议都会非常感激。

我认为问题是因为您在设置代码中使用自己的自定义应用程序

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

但您的web.config使用的是默认名称

applicationName="/"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM