2009-06-22 41 views
6

Tôi đã thực hiện mạo danh trong SharePoint khá một chút trong quá khứ bằng cách thực hiện một số việc như sau.Bạn có thể thực hiện tìm kiếm giả mạo trong SharePoint mà không cần cung cấp mật khẩu không?

SPWeb web = SPContext.Current.Web; 
string currentWebUrl = web.Url; 
SPUser user = web.EnsureUser(loginToImpersonate); 
using (SPSite site = new SPSite(currentWebUrl, user.UserToken) 
{ 
    using (SPWeb impersonatedWeb = site.OpenWeb()) 
    { 
     // Any SharePoint access here to 'impersonatedWeb' 
     // is impersonated as 'loginToImpersonate' 
    } 
} 

Lưu ý rằng điều này không yêu cầu mật khẩu của người dùng bạn đang mạo danh, nhưng yêu cầu bảo mật truy cập mã nhất định để chạy. Lưu ý rằng cuộc gọi EnsureUser cũng yêu cầu người dùng hiện tại phải là quản trị viên, nhưng có các phương pháp khác có thể được sử dụng thay cho EnsureUser để lấy đối tượng SPUser (cố gắng giữ đoạn mã của tôi đơn giản cho câu hỏi này).

Bây giờ tôi đã đặt giai đoạn ... Bây giờ tôi muốn thực hiện một FullTextSQLQuery hoặc một KeywordQuery đối với công cụ truy vấn MOSS hoặc WSS và nhận được các kết quả được bảo mật dựa trên người dùng bị mạo danh. Cả hai đối tượng đều có thể lấy SPSite trên hàm khởi tạo, nhưng bỏ qua logic giả mạo của tôi. Họ đi với người dùng hiện đang đăng nhập thay vào đó (HTTPContext.Current.User).

Ngoài ra còn có các hàm tạo khác: tên ứng dụng (chuỗi) và cho MOSS có một tệp với ServerContext đến SSP, nhưng tôi không nghĩ chúng sẽ giúp ích gì cả.

Tôi đã sử dụng Trình phản xạ trên lớp KeywordQuery và lớp Truy vấn cơ sở của nó và nó trở nên khá xấu xí khá nhanh. Tôi tin rằng logic thực tế xác định người dùng đang ở trong mã không được quản lý.

Vì vậy, tôi có thể làm điều này không?

+0

Liên kết hoạt động: http://www.threewill.com/2010/06/connect-to-sharepoint-forwarding-user-identities/ – KjellSj

Trả lời

1

Nó chỉ ra rằng bạn ca n thực hiện tìm kiếm giả mạo trong SharePoint mà không cần mật khẩu. Chúng tôi đã tìm ra điều này vào tháng 8 năm 2009 và tôi đã hồi sinh khi cập nhật Stack Overflow với câu trả lời.

Xem http://wiki.threewill.com/display/is/2010/06/18/Connect+to+SharePoint+-+Forwarding+User+Identities để biết chi tiết và đặc biệt chú ý đến các yêu cầu đặc biệt. Lưu ý rằng điều này không hoạt động với cả SharePoint 2007 và SharePoint 2010.

Rất cám ơn đồng nghiệp của tôi Eric Bowden, người đã làm tất cả công việc!

+2

Xuất hiện liên kết bị hỏng? –

+0

Liên kết làm việc: http://www.threewill.com/2010/06/connect-to-sharepoint-forwarding-user-identities/ –

+0

Cảm ơn bạn đã tìm liên kết được cập nhật. Tôi không biết chính bản thân mình đâu! –

4

Bạn cần mạo danh Windows thực sự để thực hiện việc này. Sự mạo danh SPSite không phải là mạo danh thực sự - nó chỉ nói với mô hình đối tượng WSS để viết một id người dùng khác cho các trường được tạo và sửa đổi trong cơ sở dữ liệu nội dung.

Đối với Windows mạo danh bạn sẽ không may cần cả tên đăng nhập và mật khẩu trừ khi bạn muốn mạo danh tài khoản ứng dụng sử dụng SPSecurity.RunWithElevatedPrivileges

Bạn có thể thi hành Windows mạo danh như sau:

using (Impersonator imp = new Impersonator("user", "domain", "password")) 
{ 
    // Do stuff impersonated 
} 

nơi lớp người đóng vai được triển khai dưới dạng:

public sealed class Impersonator : IDisposable 
{ 
    private WindowsImpersonationContext impersonationContext; 

    public Impersonator(string user, string domain, string password) 
    { 
    WindowsIdentity id = Logon(user, domain, password); 
    impersonationContext = id.Impersonate(); 
    } 

    public void Dispose() 
    { 
    if (impersonationContext != null) 
    { 
     impersonationContext.Undo(); 
     impersonationContext = null; 
    } 
    } 

    private WindowsIdentity Logon(string user, string domain, string password) 
    { 
    WindowsIdentity identity; 
    IntPtr handle = IntPtr.Zero; 
    bool logonSucceeded = LogonUser(
     user, domain, password, 
     8, // LOGON32_LOGON_NETWORK_CLEARTEXT 
     0, // LOGON32_PROVIDER_DEFAULT 
     ref handle); 

    if (!logonSucceeded) 
    { 
     int errorCode = Marshal.GetLastWin32Error(); 
     throw new UnauthorizedAccessException("User logon failed. Error Number: " + errorCode); 
    } 

    identity = new WindowsIdentity(handle); 
    CloseHandle(handle); 

    return identity; 
    } 

    [DllImport("advapi32.dll", SetLastError = true)] 
    private static extern bool LogonUser(string lpszUsername, 
    string lpszDomain, 
    string lpszPassword, 
    int dwLogonType, 
    int dwLogonProvider, 
    ref IntPtr phToken); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
    private static extern bool CloseHandle(IntPtr handle); 
} 
+1

Cảm ơn, Lars. Không phải là câu trả lời tôi muốn nghe, tất nhiên, nhưng thật tốt khi biết lựa chọn của tôi là gì. Tôi đánh giá cao lớp Impersonator. Cái đó nhìn đẹp đó. –

+0

Công cụ tốt Lars, cảm ơn vì điều này. –

0

Có một cách khác để thực hiện mạo danh khi thực hiện tìm kiếm bằng mô hình đối tượng. Tôi đã có thể làm cho nó hoạt động bằng cách mạo danh khi chạy với các tư nhân cao. xem bài đăng của tôi tại đây: http://vishalseth.com/post/2013/11/05/Impersonated-Searching-against-SharePoint.aspx

+1

Trong khi liên kết này có thể trả lời câu hỏi, bạn nên tóm tắt hoặc trích dẫn bài viết vì các liên kết có xu hướng phân rã theo thời gian. – pinckerman

Các vấn đề liên quan