2012-03-26 14 views
13

Mam istniejący db SQL, którego użyłem w webformach, próbuję ustawić go tak, aby działał z mvc4, ale bez powodzenia, kiedy próbuję uzyskać użytkownika po id (znam tego użytkownika istnieje) Dostaję wyjątek null.And i otwieram konfigurację aplikacji sieci web mogę wyraźnie zobaczyć, że nie ma żadnych członków ani ról..etc.Konfigurowanie istniejącego członkostwa za pomocą mvc4

Oto część config z mojego internecie froms aplikacja:

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

I tu jest dla 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> 
+0

MVC 4 stosując trochę dodatkowego Sto o Procedura weryfikacji konta. Mam ten błąd "Nie można znaleźć procedury przechowywanej" dbo.aspnet_CheckSchemaVersion "." Każdy organ znany z niektórych narzędzi do migracji do nowych danych członków? –

+0

@ThantZin Jeśli konfigurujesz nowe tabele dostawców MVC4, nie musisz używać narzędzia aspnet_regsql.exe, usuń wszystkie utworzone przez siebie tabele. Teraz zmień ciąg połączenia w pliku konfiguracyjnym. Po tym uruchomieniu konfiguracji ASP.NET i po konfiguracji będziesz miał nowe tabele. Komentarz/odpowiedź dostarczona przeze mnie poniżej odpowiedzi, jeśli masz już stare tabele dostawców w bazie danych i przechodzisz na MVC4. – formatc

Odpowiedz

4

najpierw upewnić się, aby przełączyć się dostawców Asp.Net uniwersalne (pakiet Nuget) a następnie pamiętaj, aby połączyć się z tym samym DB, co stara aplikacja. Schemat dla asp.net db nie zmienił się i powinien działać poprawnie z MVC 4.

+1

W zasadzie dowiedziałem się, na czym polega problem, MVC4 najwyraźniej korzysta z różnych dostawców członkostwa, więc musiałem tylko przejść na stare, z System.Web.Providers.DefaultProfileProvider na System.Web.Security.SqlMembershipProvider i tak samo z ról i profilu. – formatc

+0

Dziwne, widziałem rozwiązanie zaproponowane przez Izrael Lot również gdzie indziej, i wydaje się, że działa dla niektórych osób, ale to nie działa dla mnie. Wciąż pojawia się komunikat o błędzie "Podana nazwa użytkownika lub hasło jest nieprawidłowe". Nie próbowałem jednak zastąpić DefaultProfileProvider przez SqlMembershipProvider. Chciałbym móc korzystać z DefaultProfileProvider. W końcu ciągle korzystałem ze starego dostawcy członkostwa ASP.Net i odpowiednio zmodyfikowałem swój kontroler. –

1

Miałem ten sam problem - wskazując aplikację MVC4 na "starą" bazę danych aspnet. Istniejących użytkowników/haseł nie można pobrać w "domyślnych" ustawieniach (System.Web.Providers.DefaultProfileProvider) -> zauważ, że hasła są szyfrowane, a odpowiednie ustawienia są obecne w lokalnym web.config (pod system.web)

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

Jeśli dodać nowego użytkownika z „DefaultProfileProvider”, że użytkownik może się pogodzić i uwierzytelniane - to po prostu nie działa z istniejących użytkowników, które zostały dodane do „starego” operatora methinks.

nie miałem szansy „przełącznik” na stary ale podejrzewam, że to działa (dzięki user1010609) @Israel - To dziwne i to powinno działać - ale to nie robi;)

0

Pamiętaj, że musisz dołączyć do odniesień do projektu biblioteki: System.Web.Providers.dll

22

Oto mój sposób po 3 dniach Googling. Korzystając z MVC4 RC, .NET Framework 4.5, SQL Server Express z nowym SqlMemberDB utworzonym przez .NET 4 powoduje, że stary SqlMemberDB brakuje niektórych procedur przechowywanych.

  1. dodać jeszcze jednego ustawienia do <AppSetting> jak poniżej, aby wyłączyć „prosty członkostwa”:

    <add key="enableSimpleMembership" value="false" /> 
    
  2. dodatek w połączeniu z bazą danych zgodnie z wymaganiami. Używam programu SQL Server 2000, więc wyłącz instancję użytkownika.

    <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. konfiguracja ustawień kopiowania z pliku Machine.ini w ramach architektury v4 .NET.

    <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. Zmień Login() z kontrolerem konto jak poniżej

    modułu
    /// 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. Aktualizacja wylogowywania z AccountController jak poniżej

    /// aspnetSQLMember Authentication 
    FormsAuthentication.SignOut(); 
    

Dzięki,

+0

Pracowałem dla mnie. Dzięki! – JSWork

+0

dzięki za porady dotyczące wyłączania simplememhiphip. Mam przypadek, w którym nie używam simplememhiphip i zawsze zgłasza wyjątek Nie można połączyć się z serwerem SQL po pomyślnym zalogowaniu i przekierowaniu na zamierzoną stronę. Dzięki jeszcze raz! – longbkit

+1

Wierzę, że funkcja Register() w AccountController również musi zostać zmodyfikowana. –

Powiązane problemy