Приложение MVC 3 с ASP.Net Членство в членстве поставщика проблема входа - PullRequest
3 голосов
/ 18 сентября 2011

У меня, кажется, необычная проблема -

Я использовал поставщика членства в 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 -> Project -> ASP.NET Configuration), он показывает, что существует 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 голосов
/ 18 сентября 2011

Я думаю, что проблема в том, что вы используете свое собственное приложение в коде установки

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

но ваш web.config использует имя по умолчанию

applicationName="/"
...