Тайна членства в ASP.NET - PullRequest
       5

Тайна членства в ASP.NET

1 голос
/ 12 декабря 2011

Итак, я преобразовываю приложение из встроенной системы безопасности в проверку подлинности с помощью встроенного поставщика членства и веду себя наиболее странно. Изначально я использовал конфигурацию sqlexpress по умолчанию, где она создает файл aspnetdb.mdf в папке App_Data.

Однако я хотел перенести это на свой 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 Ответ

5 голосов
/ 12 декабря 2011

Прежде всего, причина создания 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>

Подробнее см. Здесь: Членство и поставщик ролей

...