【问题标题】:ASP.NET Membership MysteryASP.NET 成员身份之谜
【发布时间】:2011-12-12 03:09:44
【问题描述】:

因此,我正在使用内置的成员资格提供程序将应用程序从集成安全性转换为表单身份验证,并且具有最奇怪的行为。最初,我使用默认的 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>

【问题讨论】:

    标签: asp.net asp.net-membership


    【解决方案1】:

    首先,创建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

    【讨论】:

    • 谢谢 - 我想我一直认为配置工具足够聪明,可以获取配置设置。傻我。无论如何,这成功了!
    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多