powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF, MSSQL SERVER сквозная аутентификация.
18 сообщений из 18, страница 1 из 1
WCF, MSSQL SERVER сквозная аутентификация.
    #37233857
almunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Христос Воскрес, форумчане!
Попал в тупиковую ситуацию с олицетворением и делегированием при использовании WCF службы. Дочитался статей msdn и форумов, в том числе и буржуйских, по данной тематике до полной каши в голове, пробовал и метод «научного тыка», но проблемы решить не могу.
Имеем два сервера под управлением Windows Server 2008 R2. На одном развернут MS SQL SERVER 2008 R2, настроенный на Windows аутентификацию, на другом – IIS 7.5. Оба сервера и рабочие станции включены в один и тот же домен. Создал простенькую WCF службу и опубликовал ее на IIS. 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
<configuration>
  <appSettings/>
  <connectionStrings>
    <add name="ConnectionString"
           connectionString="Data Source=dbserver\DB1;Initial Catalog=DataBase;Integrated Security=True"
           providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <customErrors mode="Off"></customErrors>
    <compilation debug="true" targetFramework="4.0"></compilation>
    <authentication mode="Windows"/>
    <identity impersonate="true" />
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"></serviceHostingEnvironment>

    <bindings>
      <wsHttpBinding>
	 <binding>
	   <security mode="Transport">
	     <transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm"></transport>
	   </security>
	 </binding>
      </wsHttpBinding>
    </bindings>

    <services>
      <service name="WCFService.Service1" behaviorConfiguration="WCFService.Service1Behavior">
        <endpoint address="" binding="wsHttpBinding" contract="WCFService.IService1">
	</endpoint>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>        
	<behavior name="WCFService.Service1Behavior">
           <serviceMetadata httpsGetEnabled="true"/>
	   <serviceDebug includeExceptionDetailInFaults="true"/>
	</behavior>
      </serviceBehaviors>
     </behaviors>
	
  </system.serviceModel>
</configuration>


ну и собственно реализация службы такова:
Код: 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.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1
{

  [OperationBehavior(Impersonation = ImpersonationOption.Required)]
  public string GetDataBaseUser()
  {
    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
    {
      SqlCommand cmd = new SqlCommand();
      cmd.CommandText = "Test";
      cmd.CommandType = System.Data.CommandType.StoredProcedure;
      cmd.Connection = connection;
      connection.Open();
      return (string)cmd.ExecuteScalar();
    }
  }

  public string GetUser()
  {
    return System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();
   }

}

Кстати хранимка Test возвращает имя учетной записи доменного пользователя, запустившего на ее выполнение:
Код: plaintext
1.
SELECT    SUSER_SNAME() as name

Написал простенький winforms клиент данной WCF службы. App.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.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Transport">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://iiserver:443/Service1.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1"
                contract="ServiceReference.IService1" name="WSHttpBinding_IService1">
                <identity>
                    <servicePrincipalName value="host/iiserver" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

Собственно клиент вызывает методы wcf GetUser() и GetDataBaseUser(). Если при вызове метода GetUser() возвращается имя доменной учетной записи, от которой был выполнен вход в систему клиентского компа, то такого же результата я ожидаю и от вызова хранимой процедуры Test в методе GetDataBaseUser(); А получаю я следующий Exception
Код: plaintext
1.
System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: The type initializer for 'System.Data.SqlClient.SqlConnection' threw an exception.

Это всего лишь догадки, но такое ощущение, что делегирования не происходит, хотя межу IIS сервером и сервером баз данных оно установлено. Соединение с базой данных происходит не от моего пользователя, под которым я запускаю клиента, а черт знает от кого, но у пользователя этого доступа к базе нет. Следовательно, сквозная аутентификация не срабатывает. В общем,я в тупике.
Нужно реализовать систему таким образом, чтобы хранимые процедуры выполнялись от имени того пользователя, кто работает с клиентским приложением. Прошу помощи, своими силами решение данного вопроса мне видимо не потянуть. Всем спасибо!
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37233908
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20 steps to get together Windows Authentication, Silverlight and WCF service

http://rouslan.com/2009/03/20-steps-to-get-together-windows-authentication-silverlight-and-wcf-service/
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234019
almunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шайтан,

спасибо, конечно. Но может я чего не понял из этой статьи, но как раз пользователя, обратившегося к wcf службе я получаю без проблем. Вопрос в другом, как от имени этого пользователя создать соединение с базой данных и выполнить хранимую процедуру. Вот это как раз в предложенной статье и не раскрывается, к сожалению. Или я читал между строк.
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234048
hstas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
almunt,

как вы метод GetUser() вызываете? Персонифицированные креденшиалсы передаете перед вызовом?
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234065
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
almunt,

1) установлено "IntegratedSecurity = true" ?

2) ISS и SQL на разных железяках или на одном сервере?
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234066
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2) IIS .....

очепятка :)
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234067
almunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шайтан,

на оба пункта - да
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234070
almunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шайтан,

IIS и SQL на разных серверах
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234071
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
логин пользоваттеля допущен к SQL-серверу и к конкретной БД ?
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234076
almunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hstas,

нет ничего такое не передаю
Код: plaintext
1.
2.
3.
4.
5.
        private void button2_Click(object sender, EventArgs e)
        {
            ServiceReference.Service1Client client = new ServiceReference.Service1Client();
            textBox3.Text = client.GetUser();
        }
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234077
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
almuntШайтан,

IIS и SQL на разных серверах

тогда нужно идти в оснастку Kerberos и устанавливать разрешеие на передачу маркера пользователя (в Win 2003 и выше по дефолту этого делать нельзя)
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234078
almunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шайтанлогин пользоваттеля допущен к SQL-серверу и к конкретной БД ?
100%
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234085
almunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
almuntШайтанлогин пользоваттеля допущен к SQL-серверу и к конкретной БД ?
100% но конечно, если обращение к базе происходит под пользователем, который запустил клиента, в чем я сильно сомневаюсь.
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234092
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
almunt,

стр. 916 этой книжки http://www.rsdn.ru/res/book/web/aspnet20MacDonald.xml
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234094
almunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
almunt,

вот кстати, абсолютно аналогичная проблема
http://www.sql.ru/forum/actualthread.aspx?tid=815482
Автор, как будто бы ее решил. Но что-то я не могу понять, то ли в результате ответов на тему, то ли самостоятельно.
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37234186
hstas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
almunt,

смотри. перечислю несколько тонких мест.

1. IIS должен быть запущен под учетной доменной записью, у которой в настройках будет включена возможность делегирования.
2. Надо персонифицировать креды. Без этого данные о пользователе будут wcf неизвестны.
У меня в клиенте WCF сервис добавлен как Web-референс, а не Сервис-референс.
Креды персонифицирую так:
Код: plaintext
1.
2.
3.
LcrWebService	pSrv = new LcrWebService();  //экзепляр прокси
pSrv.Credentials = System.Net.CredentialCache.DefaultCredentials; //вот про это я и говорю


3. Если на машине, где стоит MS SQL - несколько инстансов сиквела - то для учетки из пункта 1 надо настравивать SPN (гугл в помощь). Если один инстанс - то не обязательно.

и 4.й пункт.
У меня не получилось настроить сквозную авторизацию для wsHttpBinding. Когда бился с этими настройками, гуглом наткнулся на импортный форум, где чувак объяснял что так с wsHttpBinding не получится.
У меня все это настройки заработали только с basicHttpBinding


Удачи
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37247001
almunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо!
Проблема решена с помощью ссылки, которую я указал выше.

Сквозная аутентификация заработала.
...
Рейтинг: 0 / 0
WCF, MSSQL SERVER сквозная аутентификация.
    #37247410
almunt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Часть проблемы я решил, но это не все...
Столкнулся со следующей проблемой

Пишу winforms клиент своей службы.
так вот вот этот код работает:

ServiceReference3.Service1Client client = new ServiceReference3.Service1Client();
client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Delegation;
textBox4.Text = client.GetDataBaseUser();
client.Close();

то есть запрос к базе данных осуществляется от имени пользователя Windows, запустившего клиент на выполнение.

Теперь стоит задача организовать выбор клиентского сертификата, привязанного к доменному пользователю, на стороне клиента и выполнять метод GetDataBaseUser() от имени пользователя сертификата. С выбором сертификата проблем нет. Но после этого мне нужно как-то получить Credentials из этого сертификата, что бы проделать вот это:

client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Delegation;


Короче, мне нужно делегировать Credentials не пользователя Windows, а Credentials пользователя, привязанного к выбранному сертификату. Текущий код после выглядит так:

private void button3_Click(object sender, EventArgs e)
{
try
{
X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, "Выбор клиентского сертификата", "Выберите сертификат из списка", X509SelectionFlag.SingleSelection);

ServiceReference3.Service1Client client = new ServiceReference3.Service1Client();
X509Certificate2 cert = scollection[0]; // выбранный сертификат из списка установленных клиентских сертификатов
//client.ClientCredentials.ClientCertificate.Certificate = cert;


client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Delegation;
textBox4.Text = client.GetDataBaseUser();
client.Close();

store.Close();
}
catch (CryptographicException)
{
Console.WriteLine("Information could not be written out for this certificate.");
}

}
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF, MSSQL SERVER сквозная аутентификация.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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