My colleague has been working on a web part in an FBA environment. Among other things, the web part pulls some data from SQL server. The grand plan for this project dictates that a DBA configures data level security in SQL (за разлику од уграђивања кориснички ИД у СКЛ упит или неки други приступ).
The problem is that SQL server doesn’t know anything about our FBA environment so it can’t trust us. We solved this problem by, у недостатку боље речи, manually impersonating an AD user so that we could connect to SQL such that SQL data level security works.
Иако ФБА је АСП.НЕТ функција, ми СхареПоинт Натион људи уче различитим претраживачима да ако упита за ФБА, you must mean you want know how to configure FBA in SharePoint. I failed to find find any information on how to enable an FBA oriented ASP.NET application to communicate with SQL in the way we needed.
У току овог истраживања, смо поново прочитали овај чланак: АСП.НЕТ Лажно
Више истраживања нас је довело до овог члана цодпројецт: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
То нам је помогло написати наш код, which I’ve included below. It’s not the most elegant stuff, али је радио. I hope you find it helpful.
Ево кода који је радио за нас:
заштићен воид бтнСеарцхЦарриер_Цлицк(објецт сендер, ЕвентАргс е) { покушати { У = ИмперсонатеУсер нови ИмперсонатеУсер(); // СВЕ: Замените акредитиве ("DomainName", "UserName", "Password"); // ЦОДЕ // иУ.Ундо(); } улов (Изузетак ек) { } } // Коришћење имитирања класе као што је поменуто у наставку. јавност класа ИмперсонатеУсер { [ДллИмпорт("advapi32.dll", СетЛастЕррор = прави)] јавност статички екстерно bool LogonUser( Стринг лпсзУсернаме, Стринг лпсзДомаин, Стринг лпсзПассворд, инт двЛогонТипе, инт двЛогонПровидер, реф ИнтПтр пхТокен); [ДллИмпорт("kernel32.dll", Цхарсет = ЦхарСет.Ауто)] приватан екстерно статички боол ЦлосеХандле(ИнтПтр ручка); приватан статички ИнтПтр токенХандле = нови ИнтПтр(0); приватан статички ВиндовсИмперсонатионЦонтект имперсонатедУсер; // Ако овај код укључити у ДЛЛ, будите сигурни да захтева да се // ради са ФуллТруст. [ПермиссионСетАттрибуте(СецуритиАцтион.Деманд, Наме = "FullTrust")] јавност воид опонашате(стринг Домаиннаме, стринг корисничког, стринг лозинку) { покушати { // Користите функцију ЛогонУсер Без менаџера да добије токен корисника за // Наведени корисник, домен, и лозинку. цонст инт ЛОГОН32_ПРОВИДЕР_ДЕФАУЛТ = 0; // Доношење овог параметра изазива ЛогонУсер да створе основну токен. цонст инт ЛОГОН32_ЛОГОН_ИНТЕРАЦТИВЕ = 2; токенХандле = ИнтПтр.Зеро; // Корак -1 Позив ЛогонУсер да добије регулатор за ознаку приступа. воид ретурнВалуе = ЛогонУсер( усерНаме, домена, лозинка, ЛОГОН32_ЛОГОН_ИНТЕРАЦТИВЕ, ЛОГОН32_ПРОВИДЕР_ДЕФАУЛТ, Некретнине токенХандле); // токенХандле - Нови безбедносни знак ако (== фалсе ретурнВалуе) { инт рет = Марсхал.ГетЛастВин32Еррор(); Цонсоле.ВритеЛине("LogonUser call failed with error code : " + право); бацити нови Систем.ЦомпонентМодел.Вин32Екцептион(право); } // Корак - 2 ВиндовсИдентити невИд = нови ВиндовсИдентити(токенХандле); // Корак -3 имперсонатедУсер = невИд.Имперсонате(); } улов (Изузетак ек) { Цонсоле.ВритеЛине("Exception occurred. " + ек.Мессаге); } } /// <резиме> /// Зауставља лажно /// </резиме> јавност воид Ундо() { имперсонатедУсер.Ундо(); // Ослободи токени. ако (токенХандле != ИнтПтр.Зеро) ЦлосеХандле(токенХандле); } }
</крај>