Почему ASP.NET игнорирует мою строку подключения к членству? - PullRequest
2 голосов
/ 19 февраля 2010

У меня есть приложение ASP.NET, использующее встроенные функции членства.Таким образом, в моем файле web.config есть строка подключения, которая выглядит следующим образом:

<add name="MembershipSqlServer" connectionString="Data Source=servername;Database=aspnetdb;uid=user;pwd=password;" />

При работе на моем компьютере разработчика все очень увлекательно.Но когда я перемещаю вещи на веб-сервер (который также запускает SQL Server), я получаю эту ошибку, когда вызывается User.IsInRole ():

System.Data.SqlClient.SqlException: сбой входапользователь 'NT AUTHORITY \ NETWORK SERVICE'.

F $% * & !!Почему он пытается подключиться таким образом?Почему он не использует имя пользователя / пароль из строки подключения?Web.config идентичен для dev и server, я использую DB на сервере во время разработки.

Ответы [ 4 ]

5 голосов
/ 19 февраля 2010

ОК, я понял ... всего 35 минут. : P

Короче говоря: членство в asp.net состоит из двух частей: поставщик членства и поставщик ROLE. Почему вы когда-нибудь хотели, чтобы эти две вещи были разделены, я не знаю ... Но мой web.config не указывал поставщика role и строку подключения, поэтому он по умолчанию был установлен в файле machine.config (иначе строка подключения LocalSqlServer).

Так что все это время пользователи моего приложения находились на сервере ... но роли хранились в локальном файле .MDF в App_Data. Тьфу.

0 голосов
/ 25 марта 2013

я думаю, что ответ таков:

 public static string ConnectionString(SPSite site)
        {
            var connectionStringField = BaseMembershipProvider(site).GetType().GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
            if (connectionStringField != null)
            {
                return connectionStringField.GetValue(BaseMembershipProvider(site)).ToString();
            }
            else
            {
                return "";
            }
        }

это сработало для меня безо всякой ошибки

спасибо, бабания

0 голосов
/ 19 февраля 2010

Вы видите это <authentication mode="Windows" /> в своем файле web.config? А другая ваша строка соединения использует Integrated Security = True; На вашем Sql-сервере для использования аутентификации Windows у вас должен быть логин (на сервере) для пользователя или группы Windows, а также связанный пользователь в базе данных.

Простое, но не предлагаемое исправление - создание имени входа для NT AUTHORITY \ NETWORK SERVICE. на вашем сервере SQL, а затем пользователь в вашей конкретной базе данных для этого сопоставляется с этим логином. Безопасный способ - сделать это для каждой из групп безопасности сети, которым требуется доступ к серверу sql, чтобы вы могли независимо управлять разрешениями группы.

0 голосов
/ 19 февраля 2010

Как выглядит раздел поставщиков членства в вашем файле web.config?Возможно ли, что вы пропустили атрибут connectionStringName?В этом случае, я полагаю, он попытается подключиться к базе данных на вашем локальном компьютере с помощью встроенной системы безопасности.

Раздел поставщиков членства в вашем файле web.config должен выглядеть примерно так:

<membership defaultProvider="SqlProvider">
  <providers>
    <add 
      name="SqlProvider" 
      type="System.Web.Security.SqlMembershipProvider" 
      connectionStringName="MembershipSqlServer"
      ...
    />
  </providers>
</membership>
...