|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
Христос Воскрес, форумчане! Попал в тупиковую ситуацию с олицетворением и делегированием при использовании 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.
ну и собственно реализация службы такова: Код: 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.
Кстати хранимка Test возвращает имя учетной записи доменного пользователя, запустившего на ее выполнение: Код: plaintext 1.
Написал простенький 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.
Собственно клиент вызывает методы wcf GetUser() и GetDataBaseUser(). Если при вызове метода GetUser() возвращается имя доменной учетной записи, от которой был выполнен вход в систему клиентского компа, то такого же результата я ожидаю и от вызова хранимой процедуры Test в методе GetDataBaseUser(); А получаю я следующий Exception Код: plaintext 1.
Это всего лишь догадки, но такое ощущение, что делегирования не происходит, хотя межу IIS сервером и сервером баз данных оно установлено. Соединение с базой данных происходит не от моего пользователя, под которым я запускаю клиента, а черт знает от кого, но у пользователя этого доступа к базе нет. Следовательно, сквозная аутентификация не срабатывает. В общем,я в тупике. Нужно реализовать систему таким образом, чтобы хранимые процедуры выполнялись от имени того пользователя, кто работает с клиентским приложением. Прошу помощи, своими силами решение данного вопроса мне видимо не потянуть. Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 14:48 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
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/ ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:04 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
Шайтан, спасибо, конечно. Но может я чего не понял из этой статьи, но как раз пользователя, обратившегося к wcf службе я получаю без проблем. Вопрос в другом, как от имени этого пользователя создать соединение с базой данных и выполнить хранимую процедуру. Вот это как раз в предложенной статье и не раскрывается, к сожалению. Или я читал между строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:38 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
almunt, как вы метод GetUser() вызываете? Персонифицированные креденшиалсы передаете перед вызовом? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:46 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
almunt, 1) установлено "IntegratedSecurity = true" ? 2) ISS и SQL на разных железяках или на одном сервере? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:55 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
2) IIS ..... очепятка :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:56 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
Шайтан, на оба пункта - да ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:56 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
Шайтан, IIS и SQL на разных серверах ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:56 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
логин пользоваттеля допущен к SQL-серверу и к конкретной БД ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:57 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
hstas, нет ничего такое не передаю Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:58 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
almuntШайтан, IIS и SQL на разных серверах тогда нужно идти в оснастку Kerberos и устанавливать разрешеие на передачу маркера пользователя (в Win 2003 и выше по дефолту этого делать нельзя) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:58 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
Шайтанлогин пользоваттеля допущен к SQL-серверу и к конкретной БД ? 100% ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 15:58 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
almuntШайтанлогин пользоваттеля допущен к SQL-серверу и к конкретной БД ? 100% но конечно, если обращение к базе происходит под пользователем, который запустил клиента, в чем я сильно сомневаюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 16:00 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 16:03 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
almunt, вот кстати, абсолютно аналогичная проблема http://www.sql.ru/forum/actualthread.aspx?tid=815482 Автор, как будто бы ее решил. Но что-то я не могу понять, то ли в результате ответов на тему, то ли самостоятельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 16:03 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
almunt, смотри. перечислю несколько тонких мест. 1. IIS должен быть запущен под учетной доменной записью, у которой в настройках будет включена возможность делегирования. 2. Надо персонифицировать креды. Без этого данные о пользователе будут wcf неизвестны. У меня в клиенте WCF сервис добавлен как Web-референс, а не Сервис-референс. Креды персонифицирую так: Код: plaintext 1. 2. 3.
3. Если на машине, где стоит MS SQL - несколько инстансов сиквела - то для учетки из пункта 1 надо настравивать SPN (гугл в помощь). Если один инстанс - то не обязательно. и 4.й пункт. У меня не получилось настроить сквозную авторизацию для wsHttpBinding. Когда бился с этими настройками, гуглом наткнулся на импортный форум, где чувак объяснял что так с wsHttpBinding не получится. У меня все это настройки заработали только с basicHttpBinding Удачи ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2011, 16:36 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
Всем спасибо! Проблема решена с помощью ссылки, которую я указал выше. Сквозная аутентификация заработала. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2011, 12:13 |
|
WCF, MSSQL SERVER сквозная аутентификация.
|
|||
---|---|---|---|
#18+
Часть проблемы я решил, но это не все... Столкнулся со следующей проблемой Пишу 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."); } } ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2011, 14:25 |
|
|
start [/forum/topic.php?fid=19&msg=37234019&tid=1397454]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 129ms |
0 / 0 |