2012-03-26 52 views
13

我有一个现有的SQL成员资格数据库,我用webforms,我试图设置它与mvc4,但没有运气,当我尝试通过id获取用户(我知道这个用户存在)我得到空exception.And网络我打开网络应用程序配置我可以清楚地看到它没有成员或角色..等等。使用mvc4设置现有的成员

这里是我的web配置的一部分栌应用:

<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> 
+0

MVC 4使用一些额外的Sto重新验证帐户的程序。我有这个错误“无法找到存储过程'dbo.aspnet_CheckSchemaVersion'”。任何机构都知道一些工具可以迁移到新的成员数据? – 2012-09-12 05:53:41

+0

@ThantZin如果您正在设置新的MVC4提供程序表,则不必使用aspnet_regsql.exe工具,请删除使用该工具创建的任何表。现在更改您的Web配置文件中的连接字符串。之后,启动ASP.NET配置,安装完成后您将拥有新表格。如果您的数据库中已经存在旧的提供程序表,并且您正在切换到MVC4,则下面提供的评论/答案将适用。 – formatc 2012-09-12 16:40:45

回答

4

首先一定要切换到Asp.Net通用提供商(NuGet包)然后确保连接到与旧应用程序相同的数据库。 asp.net db的模式没有改变,并且应该可以在MVC 4中正常工作。

+1

其实我发现问题是什么,MVC4明显使用不同的成员资格提供程序,所以我只需切换到旧的,从System.Web.Providers.DefaultProfileProvider到System.Web.Security.SqlMembershipProvider,角色和配置文件也是如此。 – formatc 2012-03-26 19:28:12

+0

奇怪的是,我已经看到了以色列地段其他地方提出的解决方案,而且它似乎适用于某些人,但它不适合我。我不断收到一条错误消息,提示“提供的用户名或密码不正确”。虽然我没有尝试通过SqlMembershipProvider替换DefaultProfileProvider。我希望能够使用DefaultProfileProvider。最后,我一直使用旧的ASP.Net会员提供商,并相应地修改了我的控制器。 – 2014-01-04 21:25:25

1

我一直有同样的问题 - 将MVC4应用程序指向“旧”aspnet数据库。无法在“默认”设置(System.Web.Providers.DefaultProfileProvider)下检索现有用户/密码 - >请注意,这些密码已加密,并且相应的设置存在于本地web.config(system.web下)

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

如果我添加的“DefaultProfileProvider”新用户用户可以核对和验证 - 它只是不添加与“老”提供记错现有的用户。

我还没有机会来“开关”到老,但我会怀疑它的工作原理(感谢user1010609) @Israel - 奇怪的是,它应该工作 - 但事实并非如此;)

0

请记住,您必须在项目库中的引用,包括: System.Web.Providers.dll

22

这里为3天之后,谷歌搜索我的方式。使用MVC4 RC,.net Framework 4.5,由.NET 4创建的SQL Server Express和新的SqlMemberDB会导致旧的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. 从v4 .NET框架下的machine.ini拷贝设置配置。

    <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. 更改登录()从账户控制器如以下从的AccountController

    /// 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. 更新注销模块如下

    /// aspnetSQLMember Authentication 
    FormsAuthentication.SignOut(); 
    

谢谢,

+0

为我工作。谢谢! – JSWork 2012-11-16 20:28:19

+0

感谢关于禁用simplemembership的提示。我有一种情况,我不使用simplemembership,它总是抛出异常无法连接到SQL服务器登录成功后,重定向到预定页面。再次感谢! – longbkit 2013-06-11 16:13:10

+1

我相信AccountController中的Register()函数也需要修改。 – 2014-01-29 20:01:54