FBA 和 SQL Server: 一個愛情故事

我的同事一直致力於在 FBA 環境中的 web 部件. 除其他外, web 部件拉一些資料從 SQL server. 為此專案的宏偉計畫規定 DBA 在 SQL 配置資料級安全性 (而不是嵌入的使用者 ID 的 SQL 查詢或某些其他方式).

問題是 SQL 伺服器不知道任何有關我們 FBA 環境,所以它不能信任我們. 我們解決了這個問題的, 好的詞, 手動類比 AD 使用者,以便我們可以連接到 SQL 這樣 SQL 資料級安全工程.

即使 FBA 是 ASP.NET 功能, 我們 SharePoint 民族人教的各種搜尋引擎,如果你要查詢的 FBA, 你一定是說你想要知道如何在 SharePoint 中配置 FBA. 我沒能找到找到任何資訊有關如何啟用 FBA 面向 ASP.NET 應用程式以與 SQL 的方式我們需要溝通.

在研究這, 我們重新讀這篇文章: ASP.NET 類比

更多的研究把我們帶到這 codproject 篇文章: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

這説明我們寫我們的代碼, 其中已經低於. 它不是最優雅的東西, 但它的工作. 我希望對您有所説明.

下面是曾為我們工作的代碼:

受保護 空 btnSearchCarrier_Click(物件寄件者, EventArgs e)
 {
 請嘗試
 {
 ImpersonateUser iU = 新增功能 ImpersonateUser();
 // TODO: 替換憑據 iU.Impersonate("功能變數名稱", "使用者名", "密碼");

//
 代碼
//

 iU.Undo();
 }
 捕獲 (Ex 的異常)
 {

 }
 }

// 使用下面所述的類比類.

公眾 ImpersonateUser
 {
 [DllImport(""advapi32.dll, 了 = 真正的)]
 公眾 靜態 extern LogonUser bool(
 字串 lpszUsername,
 字串 lpszDomain,
 字串 lpszPassword,
 int dwLogonType,
 int dwLogonProvider,
 ref IntPtr phToken);

 [DllImport(""kernel32.dll, CharSet = CharSet.Auto)]
 私人 extern 靜態 CloseHandle bool(IntPtr 控制碼);

 私人 靜態 IntPtr tokenHandle = 新增功能 IntPtr(0);
 私人 靜態 WindowsImpersonationCoNtext impersonatedUser;

 // 如果您將此代碼合併到一個 DLL, 一定要要求它
 // 運行具有 FullTrust.
 [PermissionSetAttribute(SecurityAction.Demand, 名稱 = ""FullTrust)]
 公眾 無效類比(字串功能變數名稱, 使用者名的字串, 字串密碼)
 {
 請嘗試
 {

 // 使用非託管 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,
 ref tokenHandle); // tokenHandle - 新的安全權杖

 如果 (false = = 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 撤銷()
 {
 impersonatedUser.Undo();
 // 無標記.
 如果 (tokenHandle != IntPtr.Zero)
 CloseHandle(tokenHandle);
 }
 }

</結束>

訂閱我的博客.

Technorati 標籤:

一個念頭在“FBA 和 SQL Server: 一個愛情故事

  1. 大衛早
    抱歉的張貼這不相關的問題,但搞不清楚如何從這個博客向您發送一封電子郵件.
    你有以前的帖子,在那裡你提供一個偉大的方式來篩選庫以查看未加標籤的資料. 你有任何想法,如何在整個文件庫中查看的未加標籤的文檔的清單嗎? 使用一個空的欄位,在高級搜索中不返回任何結果.
    答覆

留言

您的電子郵件地址不會被公開. 必需的地方已做標記 *