过去,我通过执行以下操作在 SharePoint 中进行了相当多的模拟。
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'
}
}
请注意,这不需要您模拟的用户的密码,但需要某些代码访问安全性才能运行。作为旁注, EnsureUser 调用还要求当前用户是管理员,但是还有其他方法可以用来代替 EnsureUser 来获取 SPUser 对象(试图让我的代码片段对于这个问题保持简单)。
现在我已经做好了准备……我现在想要针对 MOSS 或 WSS 查询引擎执行 FullTextSQLQuery 或 KeywordQuery,并根据模拟用户获得安全修整结果。这两个对象都可以在构造函数上使用 SPSite,但忽略我的模拟逻辑。它们与当前登录的用户(HTTPContext.Current.User)一起使用。
还有其他构造函数:应用程序名称(字符串),对于 MOSS,有一个带有 SSP 的 ServerContext,但我认为这些根本没有帮助。
我在 KeywordQuery 类及其基 Query 类上使用了 Reflector,它很快就变得非常难看。我相信确定用户的实际逻辑在非托管代码中处于关闭状态。
那么,我可以这样做吗?