powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Client->WCF->DB Server Windows authentication
12 сообщений из 12, страница 1 из 1
Client->WCF->DB Server Windows authentication
    #37025449
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеем следующее:
Клиент (в данном случае виноформз) - WCF Service (сервер1) - SQL Server (сервер2)

Сиквел для доступа использует только вин-аутентификацию.
На уровне сервиса виндовый эккаунт авторизутся, но когда пытаемся открыть соединение с БД предварительно имперсонировав, получаем исключение аутентификации с анонимным эккаунтом.
Вопрос: как сделать "проброс" эккаунта от сервиса к серверу БД?
Пытались сделать, как описано здесь , ничего не получается,
да, если не имперсонолизировать явно, то получаем вот такое
The type initializer for 'System.Data.SqlClient.SqlConnection' threw an exception
исключение.
Может кто сталкивался, ткните, хоть куда копать.
Спасибо
...
Рейтинг: 0 / 0
Client->WCF->DB Server Windows authentication
    #37026298
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!...
Пытались сделать, как описано здесь
...
Может кто сталкивался, ткните, хоть куда копать.
...
Я делал когда-то имперсонацию между ASP.NET и MSSAS способом примерно совпадающим с указанным в ссылке ( setspn -A MSSQLSvc/ databaseservername.fullyqualifieddomainname domain\customAccountName) - никаких проблем не было.

Вы пробовали воспроизвести по шагам те простейшие сервисы, которые предлагаются в статье?
Например, это:
Код: plaintext
1.
2.
3.
4.
5.
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string GetData(int value)
{
  return string.Format("Hi, {0}, you have entered: {1}",
                           WindowsIdentity.GetCurrent().Name, value);
}
И посмотреть, что возвращает сервис...

З.Ы. текст исключения из SQL тоже пригодился бы для обсуждения, а не его враппер...
...
Рейтинг: 0 / 0
Client->WCF->DB Server Windows authentication
    #37026479
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с asp.net проблем нет.
проблемы с WCF

авторВы пробовали воспроизвести по шагам те простейшие сервисы, которые предлагаются в статье? Например, это:

возвращает эккаунт, под которым происходит вызов, т.е. на этом уровне все ок.
но если пойти дальше и попробовать открыть подключение к БД получаем исключение:
The type initializer for 'System.Data.SqlClient.SqlConnection' threw an exception

если пойти еще дальше и в сервисе сделать следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
using (securityContext.WindowsIdentity.Impersonate()) 
{

System.Data.SqlClient.SqlConnection c = new System.Data.SqlClient.SqlConnection();

c.ConnectionString = "Data Source=mysertver;Initial Catalog=mydb;Integrated Security=True";

c.Open();

}
то получаем SqlException:
Login failed for user 'NT AUTHORITY\\ANONYMOUS LOGON'."
...
Рейтинг: 0 / 0
Client->WCF->DB Server Windows authentication
    #37026687
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!с asp.net проблем нет.
проблемы с WCF

авторВы пробовали воспроизвести по шагам те простейшие сервисы, которые предлагаются в статье? Например, это:

возвращает эккаунт, под которым происходит вызов, т.е. на этом уровне все ок.
но если пойти дальше и попробовать открыть подключение к БД получаем исключение:
The type initializer for 'System.Data.SqlClient.SqlConnection' threw an exception

если пойти еще дальше и в сервисе сделать следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
using (securityContext.WindowsIdentity.Impersonate()) 
{

System.Data.SqlClient.SqlConnection c = new System.Data.SqlClient.SqlConnection();

c.ConnectionString = "Data Source=mysertver;Initial Catalog=mydb;Integrated Security=True";

c.Open();

}
то получаем SqlException:
Login failed for user 'NT AUTHORITY\\ANONYMOUS LOGON'."

Вот это аккуратно настроили?
автор Step 4: Configure the WCF Service Identity Trusted for Constrained Delegation
In this step, you configure Active Directory to allow your WCF service to use constrained delegation to access a remote database server.

If your WCF service runs using the Network Service machine account, you must enable constrained delegation for your WCF server computer. However, if your WCF service runs under a custom domain account, you must enable constrained delegation for the custom domain account.
Честно говоря, не могу пока придумать - как убедиться в правильности настройки без обращения к SQL-серверу?
(возможно, после настройки делегирования надо перезапустить комп. или дождаться каких-нить "синхронизаций" в AD).
...
Рейтинг: 0 / 0
Client->WCF->DB Server Windows authentication
    #37026706
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu,

да, настроили.

по сути это все и было настроено давно - несколько asp.net приложений работают таким образом давно и без проблем, похоже проблема именно в конфигурировании WCF сервиса, чего-то ему не хватает, не можем понять чего :(
...
Рейтинг: 0 / 0
Client->WCF->DB Server Windows authentication
    #37026708
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!,

Вот здесь еще небольшое овервью , там и ссылочки по ходу текста есть...
...
Рейтинг: 0 / 0
Client->WCF->DB Server Windows authentication
    #37030284
drug123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение найдено.

Исключение с текстом "Login failed for user 'NT AUTHORITY\\ANONYMOUS LOGON'" возникает, если не выключить установленный по умолчанию в true параметр serviceClient.ClientCredentials.Windows.AllowNtlm = false;

Итак, рецепт делегирования прав при такой инфраструктуре:
[WinForms Client]---(HTTPS)--->[WCF Service on IIS running domain account]--->[SQL Server under domain account]

1. Конфигурируем web.config:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsBinding">
          <!-- Устанавливаем TransportWithMessageCredential: данные будут при этом шифроваться с помощью SSL, данные пользователя заворачиваются в сообщение -->
          <security mode="TransportWithMessageCredential">
            <!-- Для HTTPS доменных прав не требуем -->
            <transport clientCredentialType="None"/>
            <!-- Ожидаем данные пользователя в сообщении -->
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="Service">
        <!-- Используем описанную выше конфигурацию -->
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsBinding" contract="IService">
          <identity>
            <!-- !!! Самый важный параметр: здесь должна быть указана учетная запись, под которой работает ИИС !!! -->
            <!-- Данная учетная запись должна иметь права "Impersonate a Client After Authentication" и "Create Global Objects" на сервере -->
            <!-- Для данной учетной записи и учетной записи, под которой работает SQL, нужно настроить SPN -->
            <!-- Как настроить SPN: http://msdn.microsoft.com/en-us/library/ff650896.aspx -->
            <userPrincipalName value="iis_domain_account@corp.company.com"/>
          </identity>
        </endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
            <!-- Прячем все хвосты, которые отдаются по http -->
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

2. Создаем клиента, добавляем сервис референс, далее настраиваем конфигурацию эндпоинта в app.config:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        <!-- Определяем поведение для эндпоинта -->
        <behaviors>
          <endpointBehaviors>
            <behavior name="DelegationBehavior">
              <clientCredentials>
                <!-- Говорим, что хотим делегировать права, но не хотим не-доменную авторизацию -->
                <windows allowedImpersonationLevel="Delegation" allowNtlm="false"/>
              </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>
        <client>
            <!-- назначаем поведение эндпоинту, который сгенерирован студией -->
            <endpoint address="https://appsdev.kie.ua/CCCReports1/Service.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService"
                contract="TestService.IService" name="WSHttpBinding_IService" 
                ***behaviorConfiguration="DelegationBehavior"***>
                <identity>
                    <userPrincipalName value="iis_domain_account@corp.company.com" />
                </identity>
            </endpoint>
        </client>


3. В коде клиента указываем данные пользователя:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// Идем к сервису
WCFTestService.ServiceClient myService = new WCFTestService.ServiceClient();
// Говорим, с какими данными пользователя будем логиниться в систему
myService.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential(GetUserName(), GetPassword(), GetDomain());
// Указать способ имперсонации и отказаться от Ntlm можно и программно
myService.ClientCredentials.Windows.AllowNtlm = false;
myService.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Delegation;
// Вызываем метод сервиса
MessageBox.Show(myService.GetData(123));
myService.Close();
Приведенный выше пример для случая, если пользовательское приложение находится за пределами домена и выполняется в контексте не доменного, а виндового пользователя, но нам нужно авторизировать человека в домене, зная имя и пароль. Если у вас клиенты в домене, то нужно закоментировать строку с конструктором System.Net.NetworkCredential, тогда на сервис уйдут данные доменного пользователя, от которого запущен процесс.
...
Рейтинг: 0 / 0
Client->WCF->DB Server Windows authentication
    #37030450
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
итого:
неделя потрачена на то, чтобы три лба по очереди бились об стол WCF.

самым настойчивым оказался не я.
всем спасибо, тема раскрыта.

ЗЫ: Особенно большое спасибо хочется сказать ребятам из майкрософт за их семплы (ну не приходит им мысл в голову, что клиент запущен на одной машине, апп. сервер - на второй, сервер БД - на третьей, localhost - любимое слово) - чтобы имплементировать данную схему пришлось перерыть:
статей - штук 10 как минимум,
одним участником была куплена книга по WCF (там ответ не нашелся, по крайней мере при относительно беглом просмотре), может когда прочтем ее полностью - ответы найдутся,
потрачено немеряно времени в курилке в жарких спорах (иногда чуть не до драки доходило)

все классно - но когда попадаешь в этот процесс конфигурячиния - ужос, + голова болит.
...
Рейтинг: 0 / 0
Client->WCF->DB Server Windows authentication
    #37034951
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!,

Не могли бы вы оформить результат в виде статейки со скриншотами и выложить где-нить на блоге?
(или тут кто-то ресурс по WCF рекламировал, забыл уже кто, но статьи там приветствуются).

З.Ы. когда в следующий раз кто-то будет гуглить на ету тему, глядишь - и вас вспомнит добрым словом...
(а карма - она не пропадает, она - вечна).
...
Рейтинг: 0 / 0
Client->WCF->DB Server Windows authentication
    #37035028
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Был такой же случай (только с EF). Помог вынос обращения к БД в отдельный слой (проект).
...
Рейтинг: 0 / 0
Client->WCF->DB Server Windows authentication
    #37036865
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu(или тут кто-то ресурс по WCF рекламировал, забыл уже кто, но статьи там приветствуются).

wcf.net.ru
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Client->WCF->DB Server Windows authentication
    #38017277
SirHally
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drug123[WinForms Client]---(HTTPS)--->[WCF Service on IIS running domain account]--->[SQL Server under domain account]


Верно ли я понимаю, что из-под доменного аккаунта должен быть запущен пул, в котором находится приложение с WCF-сервисами?
Или нужно перезапустить еще что-то?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Client->WCF->DB Server Windows authentication
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]