Đồng nghiệp của tôi đã làm việc trên một phần web trong một môi trường FBA. Trong số những thứ khác, phần web kéo một số dữ liệu từ máy chủ SQL. Kế hoạch lớn cho dự án này chỉ ra rằng một DBA cấu hình bảo mật cấp dữ liệu trong SQL (như trái ngược với nhúng một ID người dùng trong một truy vấn SQL hoặc một số phương pháp tiếp cận khác).
Vấn đề là rằng máy chủ SQL không biết bất cứ điều gì về môi trường FBA vì vậy nó không thể tin tưởng chúng tôi. Chúng tôi giải quyết vấn đề này bằng, cho thiếu từ tốt hơn, theo cách thủ công mạo danh một người sử dụng quảng cáo do đó chúng tôi có thể kết nối với SQL sao cho dữ liệu SQL cấp hoạt động an ninh.
Mặc dù FBA là một tính năng ASP.NET, chúng tôi dân tộc SharePoint người đã dạy tìm kiếm các công cụ mà nếu bạn đang câu cho FBA, bạn phải có nghĩa là bạn muốn biết làm thế nào để đặt cấu hình FBA trong SharePoint. Tôi không tìm thấy bất kỳ thông tin về làm thế nào để kích hoạt một FBA theo định hướng ứng dụng ASP.NET để giao tiếp với SQL trong cách chúng ta cần tìm.
Trong quá trình nghiên cứu này, chúng tôi tái đọc bài viết này: ASP.net mạo danh
Nghiên cứu thêm dẫn chúng tôi vào bài viết này codproject: http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
Điều đó đã giúp chúng tôi viết mã của chúng tôi, Tôi đã bao gồm dưới đây. Nó không phải là công cụ thanh lịch nhất, nhưng nó đã làm việc. Tôi hy vọng bạn tìm thấy nó hữu ích.
Đây là mã mà làm việc cho chúng tôi:
bảo vệ void btnSearchCarrier_Click(người gửi đối tượng, EventArgs e) { Hãy thử { IU / ImpersonateUser = mới ImpersonateUser(); // TODO: Thay thế thông tin đăng nhập iU.Impersonate("DomainName", "Tên người dùng", "Mật khẩu"); // MÃ // iU.Undo(); } bắt (Ngoại lệ cũ) { } } // Bằng cách sử dụng mạo danh lớp như đã đề cập dưới đây. công cộng lớp học ImpersonateUser { [DllImport("advapi32.dll", SetLastError = sự thật)] công cộng tĩnh extern bool LogonUser( Chuỗi lpszUsername, Chuỗi lpszDomain, Chuỗi lpszPassword, int dwLogonType, int dwLogonProvider, REF IntPtr phToken); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] tư nhân extern tĩnh bool CloseHandle(IntPtr xử lý); tư nhân tĩnh IntPtr tokenHandle = mới IntPtr(0); tư nhân tĩnh WindowsImpersonationContext impersonatedUser; // Nếu bạn kết hợp mã này vào một DLL, Hãy chắc chắn để yêu cầu rằng nó // chạy với FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Tên = "FullTrust")] công cộng vô hiệu Impersonate(Chuỗi domainName, tên người dùng Chuỗi, Chuỗi mật khẩu) { Hãy thử { // Sử dụng các chức năng LogonUser không được quản lý để có được người sử dụng mã thông báo cho // người dùng được chỉ định, tên miền, và mật khẩu. const int LOGON32_PROVIDER_DEFAULT = 0; // Đi qua các tham số này gây ra LogonUser để tạo ra một mã thông báo chính. const int LOGON32_LOGON_INTERACTIVE = 2; tokenHandle = IntPtr.Zero; // Bước -1 Gọi LogonUser để có được một xử lý cho một mã thông báo truy cập. bool returnValue = LogonUser( tên người dùng, domainName, mật khẩu, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, REF tokenHandle); // tokenHandle - mới bảo mật mã thông báo Nếu (sai == returnValue) { int ret = Marshal.GetLastWin32Error(); System.console.WriteLine("LogonUser cuộc gọi thất bại với mã lỗi : " + RET); ném mới System.ComponentModel.Win32Exception(RET); } // Bước - 2 WindowsIdentity newId = mới WindowsIdentity(tokenHandle); // Bước -3 impersonatedUser = newId.Impersonate(); } bắt (Ngoại lệ cũ) { System.console.WriteLine("Ngoại lệ xảy ra. " + cũ.Tin nhắn); } } /// <tóm tắt> /// Điểm dừng mạo danh /// </tóm tắt> công cộng void Undo() { impersonatedUser.Undo(); // Miễn phí các thẻ. Nếu (tokenHandle != IntPtr.Zero) CloseHandle(tokenHandle); } }
</kết thúc>