2012-03-26 27 views
13

Tôi có một thành viên SQL hiện có mà tôi đã sử dụng với biểu mẫu web, tôi đang cố gắng thiết lập để làm việc với mvc4 nhưng không may mắn, khi tôi cố gắng lấy người dùng theo id (Tôi biết người dùng này tồn tại) Tôi nhận được ngoại lệ null.Và web tôi mở cấu hình ứng dụng web tôi có thể thấy rõ ràng nó không có thành viên hoặc vai trò..vv.Thiết lập tư cách thành viên hiện tại với mvc4

Dưới đây là một phần của cấu hình từ web của tôi froms ứng dụng:

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

Và đây là dành cho 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 sử dụng thêm một số Sto tái Thủ tục xác minh tài khoản. Tôi đã gặp lỗi này "Không thể tìm thấy thủ tục được lưu trữ 'dbo.aspnet_CheckSchemaVersion'." Bất kỳ cơ thể nào đã biết một số công cụ để di chuyển sang Dữ liệu thành viên mới? –

+0

@ThantZin Nếu bạn đang thiết lập bảng nhà cung cấp MVC4 mới, bạn không phải sử dụng công cụ aspnet_regsql.exe, hãy xóa bất kỳ bảng nào bạn đã tạo với điều đó. Bây giờ thay đổi chuỗi kết nối trong tập tin web confing của bạn. Sau đó, khởi động ASP.NET cấu hình và sau khi thiết lập, bạn sẽ có bảng mới. Các bình luận/câu trả lời được cung cấp bởi tôi dưới đây trả lời aplies nếu bạn đã có bảng nhà cung cấp cũ trong cơ sở dữ liệu của bạn và bạn đang chuyển sang MVC4. – formatc

Trả lời

4

Đầu tiên hãy chắc chắn để chuyển sang nhà cung cấp Asp.Net Universal (gói NuGet) và sau đó đảm bảo kết nối với cùng một DB như ứng dụng cũ. Lược đồ cho asp.net db không thay đổi và sẽ hoạt động tốt với MVC 4.

+1

Thực ra tôi đã phát hiện ra vấn đề là gì, MVC4 dường như sử dụng các nhà cung cấp thành viên khác nhau vì vậy tôi chỉ phải chuyển sang các nhà cung cấp cũ, từ System.Web.Providers.DefaultProfileProvider sang System.Web.Security.SqlMembershipProvider và giống với vai trò và hồ sơ. – formatc

+0

Lạ lùng, tôi đã thấy giải pháp được đề xuất bởi Israel Lot ở những nơi khác, và dường như nó có tác dụng đối với một số người, nhưng nó không hiệu quả đối với tôi. Tôi tiếp tục nhận được thông báo lỗi cho biết "Tên người dùng hoặc mật khẩu được cung cấp không chính xác". Tôi đã không cố gắng thay thế DefaultProfileProvider bởi SqlMembershipProvider mặc dù. Tôi đã có thể thích để có thể sử dụng DefaultProfileProvider. Cuối cùng, tôi tiếp tục sử dụng nhà cung cấp thành viên ASP.Net cũ, và tôi đã sửa đổi bộ điều khiển của mình cho phù hợp. –

1

Tôi đã gặp sự cố tương tự - chỉ ứng dụng MVC4 vào cơ sở dữ liệu aspnet cũ. Người dùng/mật khẩu hiện tại không thể truy xuất được trong cài đặt "mặc định" (System.Web.Providers.DefaultProfileProvider) -> lưu ý các mật khẩu này được mã hóa và các cài đặt thích hợp có mặt trong web.config cục bộ (trong system.web)

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

Nếu tôi thêm một người dùng mới với "DefaultProfileProvider" người dùng có thể được hòa giải và chứng thực - nó chỉ không làm việc với người dùng hiện tại đã được thêm vào với nhà cung cấp "cũ" hình như.

tôi đã không có cơ hội để "chuyển đổi" để cái cũ nhưng tôi sẽ nghi ngờ rằng nó hoạt động (nhờ user1010609) @Israel - Nó là số lẻ và nó cũng làm việc - nhưng nó không;)

0

Hãy nhớ rằng bạn phải đưa vào tài liệu tham khảo của dự án của bạn thư viện: System.Web.Providers.dll

22

đây là cách của tôi sau 3 ngày Googling. Sử dụng MVC4 RC, .net Framework 4.5, SQL Server Express với mới SqlMemberDB được tạo ra bởi .NET 4 gây cũ SqlMemberDB thiếu một số thủ tục được lưu trữ.

  1. thêm vào thêm một thiết lập để <AppSetting> như dưới đây để vô hiệu hóa "thành viên đơn giản":

    <add key="enableSimpleMembership" value="false" /> 
    
  2. thêm vào kết nối cơ sở dữ liệu theo yêu cầu. Tôi đang sử dụng SQL Server 2000, vì vậy vô hiệu hóa cá thể người dùng.

    <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. cấu hình cài đặt sao chép từ machine.ini trong v4 Khuôn khổ .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. Thay đổi Đăng nhập() từ điều khiển tài khoản như sau

    /// 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. Cập nhật Logoff mô-đun từ AccountController như sau

    /// aspnetSQLMember Authentication 
    FormsAuthentication.SignOut(); 
    

Cảm ơn,

+0

Làm việc cho tôi. Cảm ơn! – JSWork

+0

cảm ơn các mẹo để vô hiệu hóa tính đơn giản. Tôi có một trường hợp mà tôi không sử dụng simplemembership và nó luôn luôn ném ngoại lệ Không thể kết nối với máy chủ SQL sau khi đăng nhập thành công và chuyển hướng đến trang dự định. Cảm ơn một lần nữa! – longbkit

+1

Tôi tin rằng chức năng Register() trong AccountController cũng cần được sửa đổi. –

Các vấn đề liên quan