ASP.NET成员之谜

时间:2011-12-12 03:09:44

标签: asp.net asp.net-membership

因此,我正在使用内置成员资格提供程序将应用程序从集成安全性转换为表单身份验证,并且具有最奇怪的行为。最初,我使用默认的sqlexpress配置,它在App_Data文件夹中创建一个aspnetdb.mdf文件。

但是,我想将它移到我的SQL Server,并通过在SQL Server数据库中创建过程和表并将我的提供程序指向该数据库来实现。然而,当我运行网站管理工具时,它不会查看SQL Server。

它一直在创建一个aspnetdb.mdf文件,并使用它,即使我的应用程序似乎正在点击SQL数据库。最后,我关闭了SQLEXPRESS服务,现在是真正奇怪的地方发生的地方。

登录正常 - Membership.Provider.ValidateUser(LoginUser.UserName, LoginUser.Password)返回true。但是,当进行IsInRole调用时,它将超时无法连接到数据库。显然,它正在尝试连接到SQLEXPRESS数据库。我重新启动了IIS,重启数据库服务无济于事。

这不是告诉会员服务要点击的数据库的正确位置:

<connectionStrings> 
    <add name="MyConnection" connectionString="user id=myuser;password=mypassword;data source=SERVER\INSTANCE;initial catalog=mycatalog;"/>
</connectionStrings>

<system.web>
    <authentication mode="Forms">
        <forms name="formsauth" protection="None" path="/" loginUrl="~/Account/Login.aspx" cookieless="UseCookies"/>
    </authentication>
    <roleManager enabled="true" />
    <membership>
        <providers>
            <remove name="AspNetSqlMembershipProvider"/>
            <add name="AspNetSqlMembershipProvider" 
     type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
     connectionStringName="MyConnection" 
     enablePasswordRetrieval="false" 
     enablePasswordReset="true" 
     requiresQuestionAndAnswer="false" 
     applicationName="/MyApp" 
     requiresUniqueEmail="false" 
     minRequiredPasswordLength="6" 
     minRequiredNonalphanumericCharacters="0" 
     passwordFormat="Hashed" 
     maxInvalidPasswordAttempts="5" 
     passwordAttemptWindow="10" 
     passwordStrengthRegularExpression=""
     />
        </providers>

1 个答案:

答案 0 :(得分:5)

首先,创建aspnetdb.mdf的原因是因为您正在使用ASP.NET配置工具。它仅适用于SQL Express实例。它不能在完全成熟的SQL Server上使用。为此,您基本上需要在自己的应用程序中重新创建管理面板。

如果您希望在本地SQL Server下使用角色,则还需要将web.config配置为指向角色提供程序的SQL Server。默认情况下,它指向成员资格提供程序也指向的aspnetdb.mdf文件。

例如:

<system.web>
    <roleManager defaultProvider="SqlRoleProvider" enabled="true">
      <providers>
        <clear />
        <add name="SqlRoleProvider"
             type="System.Web.Security.SqlRoleProvider"
             connectionStringName="MyConnection"/> <!--- Point this to your sql server -->
      </providers>
    </roleManager>
</system.web>

对你而言,它看起来像这样:

<configuration>
  <connectionStrings>   
    <add name="MyConnection" connectionString="user id=myuser;password=mypassword;data source=SERVER\INSTANCE;initial catalog=mycatalog;"/>
  </connectionStrings>

  <system.web>
    <authentication mode="Forms">
      <forms name="formsauth" protection="None" path="/" loginUrl="~/Account/Login.aspx" cookieless="UseCookies"/>
    </authentication>

    <membership>
      <providers>
        <remove name="AspNetSqlMembershipProvider"/>
        <add name="AspNetSqlMembershipProvider" 
             type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
             connectionStringName="MyConnection" 
             enablePasswordRetrieval="false" 
             enablePasswordReset="true" 
             requiresQuestionAndAnswer="false" 
             applicationName="/MyApp" 
             requiresUniqueEmail="false" 
             minRequiredPasswordLength="6" 
             minRequiredNonalphanumericCharacters="0" 
             passwordFormat="Hashed" 
             maxInvalidPasswordAttempts="5" 
             passwordAttemptWindow="10" 
             passwordStrengthRegularExpression=""/>
      </providers>
    </membership>

    <roleManager defaultProvider="SqlRoleProvider" enabled="true">
      <providers>
        <clear />
        <add name="SqlRoleProvider"
             type="System.Web.Security.SqlRoleProvider"
             connectionStringName="MyConnection"/> <!--- Point this to your sql server -->
      </providers>
    </roleManager>
  </system.web>
</configuration>

请点击此处了解详情:Membership and Role Provider