私の同僚は、FBA 環境で web パーツに取り組んでいます. 他のものの間で, web パーツは、SQL サーバーからいくつかのデータを引っ張る. このプロジェクトの壮大な計画を指示、DBA が SQL でデータ レベルのセキュリティを構成します (SQL クエリまたはいくつか他の方法でユーザー ID を埋め込むのではなく).
問題は、SQL server が知っていないこと、FBA の環境については何もそれは私たちを信頼することはできませんので. 我々 がこの問題を解決, 良い言葉の欠如, 手動で AD ユーザーを偽装して SQL データ レベルのセキュリティのしくみその SQL に接続することは、.
FBA が ASP.NET 機能です。, 我々 の SharePoint の国民は様々 な検索エンジンは FBA のクエリを実行している場合を教えています。, SharePoint で FBA を構成する方法を知っている場合を意味する必要があります。. 私を見つけることができなかった、FBA を有効にする方法については任意指向 SQL と我々 が必要な方法で通信する ASP.NET アプリケーション検索.
この研究の過程で, 我々 は再この記事を読む: ASP.NET の偽装
多くの研究は、この codproject の記事に私たちを導いた: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
それは私たちは私たちのコードを書くを助けた, 以下にします。. それは最も洗練されたものではないです。, しかし、それは働きました. 私はあなたはそれが役立つことを願ってください。.
ここでは私たちのために働いたコードです。:
保護 void btnSearchCarrier_Click(オブジェクトの送信者, EventArgs e) { してください。 { ImpersonateUser iU = 新機能 ImpersonateUser(); // TODO: 資格情報 iU.Impersonate を交換します。("DomainName", 「ユーザー名」, 「パスワード」); // コード // iU.Undo(); } キャッチ (Ex 例外) { } } // 下記のように偽装クラスを使用してください。. パブリック クラス ImpersonateUser { [DllImport(「advapi32.dll」, SetLastError = true)] パブリック 静的 extern bool LogonUser( 文字列 lpszUsername, 文字列 lpszDomain, 文字列 lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] プライベート extern 静的 bool CloseHandle(IntPtr ハンドル); プライベート 静的 IntPtr tokenHandle = 新機能 IntPtr(0); プライベート 静的 偽装 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 戻り値 = LogonUser( ユーザー名, ドメイン名, パスワード, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle); // tokenHandle - 新しいセキュリティ トークン 場合 (returnValue = = false) { int ret = Marshal.GetLastWin32Error(); Console.WriteLine("LogonUser の呼び出しエラー コードで失敗しました : " + ret); スロー 新しい System.ComponentModel.Win32Exception(ret); } // ステップ - 2 WindowsIdentity newId = 新機能 WindowsIdentity(tokenHandle); // ステップ -3 impersonatedUser = newId.Impersonate(); } キャッチ (Ex 例外) { Console.WriteLine("例外が発生しました. " + ex.メッセージ); } } /// <概要> /// 停止偽装 /// </概要> パブリック ボイド元に戻す() { impersonatedUser.Undo(); // 無料のトークン. 場合 (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</終了>