Настройка существующего членства с mvc4 - PullRequest
13 голосов
/ 26 марта 2012

У меня есть существующая база данных членства в SQL, которую я использовал с веб-формами, я пытаюсь настроить ее для работы с mvc4, но безуспешно, когда я пытаюсь получить пользователя по идентификатору (я знаю, что этот пользователь существует), я получаю нулевое исключение.И в Интернете я открываю конфигурацию веб-приложения, и я четко вижу, что в ней нет ни членов, ни ролей ... и т. Д.

Вот часть конфигурации из моего веб-приложения из приложения:

<configuration>
  <connectionStrings>
    <add name="ApplicationServices" connectionString="Data Source=myserver;Initial Catalog=mydb;User ID=myid;Password=mypwd" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" 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="/" />
      </providers>
      <properties>
        <add name="UrgentPoints" type="System.Int32" defaultValue="0" />
      </properties>
    </profile>
    <roleManager enabled="true">
      <providers>
        <clear />
        <add connectionStringName="ApplicationServices" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
        <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" />
      </providers>
    </roleManager>
....

А здесьдля mvc:

<configuration>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=myserver;Initial Catalog=mydb;User ID=myid;Password=mypwd" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="true" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    <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>
    <profile defaultProvider="DefaultProfileProvider">
      <providers>
        <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </profile>
    <membership>
      <providers>
        <add connectionStringName="DefaultConnection" enablePasswordRetrieval="false"
          enablePasswordReset="true" requiresQuestionAndAnswer="false"
          requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6"
          minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
          applicationName="/" name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </providers>
    </membership>
    <roleManager>
      <providers>
        <add connectionStringName="DefaultConnection" applicationName="/"
          name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </providers>
    </roleManager>
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </sessionState>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>

Ответы [ 4 ]

22 голосов
/ 12 сентября 2012

Вот мой путь после 3 дней гуглить.Использование MVC4 RC, .net Framework 4.5, SQL Server Express с новым SqlMemberDB, созданным в .NET 4, приводит к тому, что старому SqlMemberDB не хватает некоторой хранимой процедуры.

  1. добавьте еще одну настройку к <AppSetting> как показано ниже для отключения «простого членства»:

    <add key="enableSimpleMembership" value="false" />
    
  2. добавьте соединение с базой данных по мере необходимости.Я использую SQL Server 2000, поэтому отключите пользовательский экземпляр.

    <add name="ScqMember_Context" 
         connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=MemberDB;User ID=xxx;Password=xxx;Integrated Security=False;User Instance=False;MultipleActiveResultSets=False" 
         providerName="System.Data.SqlClient" />
    
  3. скопируйте конфигурацию настроек из machine.ini в v4 .NET Framework.

    <membership>
        <providers>
            <clear/>
            <add name="AspNetSqlMembershipProvider" 
                 type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
                 connectionStringName="ScqMember_Context" 
                 enablePasswordRetrieval="false" enablePasswordReset="true" 
                 requiresQuestionAndAnswer="true" applicationName="/" 
                 requiresUniqueEmail="false" passwordFormat="Hashed" 
                 maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" 
                 minRequiredNonalphanumericCharacters="1" 
                 passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
        </providers>
    </membership>
    <profile>
        <providers>
            <clear/>
            <add name="AspNetSqlProfileProvider" 
                 connectionStringName="ScqMember_Context" 
                 applicationName="/" 
                 type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>
    </profile>
    <roleManager enabled="true">
        <providers>
            <clear />
            <add connectionStringName="ScqMember_Context" 
                 applicationName="/"
                 name="AspNetSqlRoleProvider" 
                 type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>
    </roleManager>
    
  4. Измените Login () из Account Controller, как показано ниже

     /// aspnetSQLMember Authentication
     if (ModelState.IsValid)
     {
         if (Membership.ValidateUser(model.UserName, model.Password))
         {
             FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
    
             if (Url.IsLocalUrl(returnUrl))
             {
                 return Redirect(returnUrl);
             }
             else
             {
                 return RedirectToAction("Index", "Home");
             }
         }
         else
         {
             ModelState.AddModelError("", "The user name or password provided is incorrect.");
         }
     }
    
  5. Обновите модуль выхода из AccountController, как показано ниже

    /// aspnetSQLMember Authentication
    FormsAuthentication.SignOut();
    

Спасибо

4 голосов
/ 26 марта 2012

Сначала обязательно переключитесь на Asp.Net Universal Providers (пакет nuget), а затем обязательно подключитесь к той же БД, что и старое приложение.Схема для базы данных asp.net не изменилась и должна нормально работать с MVC 4.

1 голос
/ 31 июля 2012

Помните, что вы должны включить в ссылки вашего проекта библиотеку: System.Web.Providers.dll

1 голос
/ 10 июня 2012

У меня возникла та же проблема - указание приложению MVC4 на «старую» базу данных aspnet.Существующие пользователи / пароли не могут быть извлечены в настройках «по умолчанию» (System.Web.Providers.DefaultProfileProvider) -> обратите внимание, что эти пароли зашифрованы, и соответствующие параметры присутствуют в локальном файле web.config (в system.web)

<machineKey
  validationKey= "A3..."
  decryptionKey= "8B..."
  validation="SHA1"
  decryption="AES"/>

Если я добавлю нового пользователя с «DefaultProfileProvider», то этот пользователь может быть согласован и аутентифицирован - он просто не будет работать с существующими пользователями, которые были добавлены с помощью «старых» метинков провайдера.

У меня не было возможности «переключиться» на старое, но я подозреваю, что это работает (спасибо user1010609) @Israel - Это странно и должно работать - но это не так;)

...