ASP.NET成员之谜

syd*_*yos 1 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>
Run Code Online (Sandbox Code Playgroud)

Mik*_*ley 5

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

如果您希望在本地SQL Server下使用Roles,则还需要将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>
Run Code Online (Sandbox Code Playgroud)

对你来说它看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此处:成员和角色提供者