Мой коллега работает на веб-части в среде FBA. Среди прочего, веб-часть тянет некоторые данные с сервера SQL server. Великий план для этого проекта диктует, что администратор настраивает безопасность на уровне данных в SQL (в противовес внедрение ID пользователя в SQL-запрос или другой подход).
Проблема заключается в том, что SQL server ничего не знает о нашей окружающей среды FBA поэтому он не может доверять нам. Мы решили эту проблему путем, из-за отсутствия лучшего слова, вручную олицетворения пользователя AD, так что мы могли бы подключиться к SQL, таким образом, чтобы данные SQL уровня безопасности работ.
Несмотря на то FBA ASP.ЧИСТАЯ функция, Мы нация SharePoint люди научили различных поисковых систем, что если вы запроса агента FBA, Вы должны означает, что вы хотите знать, как настроить агент FBA в SharePoint. Я смог найти любую информацию о том, как включить агент FBA ориентированных приложений ASP.NET для взаимодействия с SQL таким образом, нам необходимо найти.
В ходе этого исследования, мы перечитать эту статью: ASP.NET олицетворения
Дополнительные исследования привели нас к этой codproject статьи: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Это помогло нам написать наш код, который я включил ниже. Это не самые элегантные вещи, но он работал. Я надеюсь, что вы найдете ее полезной.
Вот код, который работал для нас:
Защита void btnSearchCarrier_Click(Объект отправителя, EventArgs e) { Попробуйте { ImpersonateUser МЕ = Новые функции ImpersonateUser(); // TODO: Заменить полномочия iU.Impersonate(«Имя_домена», «Имя пользователя», «Пароль»); // КОД // iU.Undo(); } улов (Исключение ex) { } } // Использование олицетворения класса как указано ниже. государственные класс ImpersonateUser { [Атрибут DllImport(«advapi32.dll», SetLastError = Истина)] государственные статический внешний bool LogonUser( Строка lpszUsername, Строка lpszDomain, Строка lpszPassword, int dwLogonType, int dwLogonProvider, БС IntPtr phToken); [Атрибут DllImport(«kernel32.dll», CharSet = CharSet.Auto)] частные внешний статический bool CloseHandle(Дескриптор IntPtr); частные статический IntPtr tokenHandle = Новые функции IntPtr(0); частные статический WindowsImpersonationContext impersonatedUser; // Если включить этот код в библиотеку DLL, не забудьте потребовать, чтобы он // запускается с FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Имя = «FullTrust»)] государственные void олицетворение(строковое имя домена, строковое имя пользователя, Строка пароля) { Попробуйте { // Использовать неуправляемой функции LogonUser для получения маркера для пользователя // указанный пользователь, домен, и пароль. const int LOGON32_PROVIDER_DEFAULT = 0; // Этот параметр заставляет LogonUser для создания основной маркер. const int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Шаг -1 Вызов метода LogonUser для получения дескриптора маркера доступа. bool returnValue = LogonUser( имя пользователя, имя_домена, пароль, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, номер tokenHandle); // tokenHandle - новый маркер безопасности Если (ложь == returnValue) { int ret = Marshal.GetLastWin32Error(); Console.WriteLine(«Сбой вызова метода LogonUser с кодом ошибки : " + RET); бросать новые System.ComponentModel.Win32Exception(RET); } // Шаг - 2 WindowsIdentity newId = Новые функции WindowsIdentity(tokenHandle); // Шаг -3 impersonatedUser = newId.Impersonate(); } улов (Исключение ex) { Console.WriteLine(Произошло исключение". " + бывший.Сообщение); } } /// <Резюме> /// Остановки олицетворения /// </Резюме> государственные void Undo() { impersonatedUser.Undo(); // Свободные маркеров. Если (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</конец>