Mono към SQL Server с Windows Auth

Бързо...

Как да използвате Windows Authentication към SQL Server с Mono SQL Client, работещ на Windows без< /em> потребителско име+парола в низа за връзка?

Още...

  • Трябва да използваме Mono, за да поддържаме множество платформи за някои компоненти на нашето приложение
    Това е външно ограничение, което не можем да променим

  • Ще изпълняваме компонентите, които имат достъп до базата данни само под Windows
    Функциите за преносимост/ОС-агностик на Mono SQL Client не добавят стойност

Това означава, че всеки компонент, работещ на различен от Windows, няма да има достъп до базата данни на SQL Server

  • Процесът се изпълнява под потребител на Windows (истински потребител, сервизен акаунт, каквото и да е)

  • Вграждането на потребителско име и пароли е лошо нещо
    Без значение от кой ъгъл идвате

И така, как можем да активираме Mono SQL Client да чете NT Logon Token на потребителя, изпълняващ процеса, и да го предава на SQL Server? Точно както прави MS .net?

  • Има ли флаг или настройка, която не е добре документирана

  • Трябва ли да внедрим собствено разширение?
    Ако е така, ние наистина ли сме първите хора, които искат да направят това?

Има 5 други въпроса (в момента) с етикет Mono и SQL-Server: те не отговарят на този...


person gbn    schedule 02.05.2012    source източник
comment
Нямам отговор за вас, но човек трябва да се запита дали бихте могли да третирате AD като Kerberos сървъра, какъвто е, и да получите билет, който да използвате за вашето удостоверяване. Това е наистина интересен проблем!   -  person Ben Thul    schedule 02.05.2012
comment
@BenThul: Ще го проучим. Направете отговор, моля: ще гласувам за. Може и да ни помогне да решим проблема.   -  person gbn    schedule 02.05.2012
comment
О... още не знам дали бих обмислил това, което имам като отговор. Просто се надявам да доведе до такъв.   -  person Ben Thul    schedule 03.05.2012
comment
Доколкото ми е известно, Windows удостоверяването на SQL Server разчита на AD, което няма аналог в UNIX или Linux. В такъв случай не трябва да очаквате Mono да има тази реализация, освен ако не я напишете сами. Mono обикновено се фокусира върху преносимите части, поради ограничените си ресурси.   -  person Lex Li    schedule 07.05.2012
comment
@Siva: да, правилно (споменах го), но някой някога заобикалял ли е това или публикувал ли е някакво разширение? Това е смисъла на въпроса ми...   -  person gbn    schedule 07.05.2012


Отговори (2)


Това не е толкова лесно за постигане, колкото звучи. Както съм сигурен, че знаете, Mono SqlClient има поддръжка за NT удостоверяване:

Има формат на низ за връзка за NT удостоверяване: Server=hostname;Database=databaseName;User ID=windowsDomain\windowsUserid;Password=windowsPassword;Integrated Security=SSPI

Но, разбира се, искате по-простата форма на Integrated Security=SSPI и оставете ръкостискането за удостоверяване на NT да използва текущите идентификационни данни на процеса. И тук е проблемът. Въпреки че е тривиално да се извлече текущото потребителско име (идентификация) на процеса, за процеса е невъзможно да открие своите собствени идентификационни данни парола. Когато извършва NT удостоверяване, процесът на Windows всъщност не извършва удостоверяването, а вместо това пита Locas Security Authority (известен още като LSASS.EXE, любопитни факти: не прикачвайте програма за отстраняване на грешки към него ;) ), за да удостоверите този процес. Което означава, че всяка библиотека, която иска да постигне същото, трябва да използва същия протокол, т.е. помолете LSA да го удостовери. Действителните подробности за любопитните са в последователността на AcquireCredentialHandle, InitializeSecurityContext, AcceptSecurityContext, както е описано в Използване на SSPI. Не проучих моно източника за SqlClient, но съм почти сигурен, че използват някои GSS-API библиотека за удостоверяване, не SSPI. следователно по дефиниция те изискват да знаят паролата, тъй като сами ще извършват Kerberos обмена, а не да искат LSA да го направи от тяхно име.

Това, както можете да кажете, е спекулация и по-скоро предположение от моя страна, но бих се изненадал да чуя различна история. Въпреки че със сигурност е възможно да се разклони или закърпи Mono.Data.Tds и да се промени изпълнението на удостоверяване, за да се използва SSPI вместо GSS, това по дефиниция би било непреносимо специфично за Windows изпълнение. Предполагам, че има малък стимул за това, като се има предвид, че привличащата точка №1 на Mono е, че не е специфична за Windows. Страхувам се, че ще трябва да го приложите сами.

person Remus Rusanu    schedule 07.05.2012
comment
Трябва да използваме Mono по различни причини: но непреносимостта не е проблем за компонентите, които се свързват с базата данни. И можем да избегнем паролите в обикновен текст, ако го приложим - person gbn; 07.05.2012
comment
Не казвам, че няма смисъл за вас. Казвам, че вероятно не се изпълнява от моно. - person Remus Rusanu; 07.05.2012
comment
Обяснението на @RemusRusanu е правилно. Mono не прилага интегрирани връзки без парола към SQL сървър поради причините, които посочи. Разбира се, всичко това е с отворен код, така че вероятно е възможно да го добавите към платформа, различна от Windows. Не забравяйте да споделите вашите открития с общността :-) - person poupou; 08.05.2012

Използвайте NTLM Authorization Proxy Server и се свържете към SQL Server чрез проксито.

person Bahribayli    schedule 14.05.2012