65.9K
CodeProject 正在变化。 阅读更多。
Home

SharePoint 2010 中的模拟

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2012年8月2日

CPOL

2分钟阅读

viewsIcon

62907

downloadIcon

368

SharePoint 2010 中身份冒充的方法。

引言

在本文中,我们将探讨 SharePoint 2010 中的身份冒充方法。

什么是身份冒充?

身份冒充是一种安全特性,它能够控制代码执行所使用的身份。 身份冒充具有以下优势:

  • 通过低权限用户运行高权限代码
  • 以其他用户的身份记录更改

SharePoint 2010 中有哪些身份冒充方法?

SharePoint 2010 提供了以下身份冒充方法:

  1. RunWithElevatedPrivileges 以系统帐户用户身份冒充
  2. 将用户令牌传递到 SPSite 中,以冒充特定用户
  3. 使用 Windows API

注意:系统帐户 (SHAREPOINT\system) 是 SharePoint 的应用程序池用户。 如果您在客户端操作系统 (Windows 7 / Vista) 上使用开发人员安装,则帐户名称将不同。

现在让我们看看如何使用上述方法。

  1. RunWithElevatedPrivileges
  2. 这是最常用的身份冒充方法。

    SPSecurity.RunWithElevatedPrivileges(() =>
                    {
                        // Your code here
                    });

    注意:在使用 RunWithElevatedPrivileges 的情况下,系统帐户用于执行活动。

  3. 传递用户令牌
  4. SPUserToken 是我们用于此目的的服务器模型。 此类可以表示每个用户的令牌。 用户令牌实际上是一个字节数组。

    SPUser 类包含名为 UserToken 的属性。 将 SPUserToken 实例传递到 SPSite 构造函数中可以冒充特定用户。

    例如:new SPSite(UrlText.Text, user.UserToken);

    要枚举站点中的所有用户,可以使用 web.Users 属性。

    例如:web.Users

运行代码

附带的源代码包含以下示例:

  1. 枚举用户
  2. 要枚举给定网站的用户,可以使用以下代码:

    using (SPSite site = new SPSite(UrlText.Text))
    {
        using (SPWeb web = site.OpenWeb())
        {
            SPContext context = SPContext.GetContext(web);
            var users = context.Web.Users;
    
            // Display to grid
            usersGrid.DataSource = users.Cast<SPUser>().ToList<SPUser>();
        }
    }

    单击按钮后,我们可以看到如下所示的用户:

    • 请注意,我使用的站点只有两个用户。
    • 当前登录的用户是管理员。

  3. 冒充每个用户创建数据
  4. 现在我们可以尝试冒充每个用户创建列表项。 创建的项目将具有系统属性 > 创建者设置为不同的用户

    以下代码执行相同的操作:

    int count = 1;
    foreach (SPUser user in web.Users)
    {
        SPSite newSite = new SPSite(UrlText.Text, user.UserToken); // Impersonate
        SPWeb newWeb = newSite.OpenWeb();
        SPListItem item = newWeb.Lists[ListName].AddItem();
        item["Title"] = "Item " + count++.ToString();
        item.Update();
    
        newSite.Dispose();
        newWeb.Dispose();
    }

    运行上述代码后,我们可以看到创建的项目如下所示:

    请注意,每行的“创建者”属性不同。

    注意:如果上述任何用户没有写入权限,将抛出异常。

  5. 使用 RunWithElevatedPrivileges 创建数据
  6. 现在我们可以尝试使用 RunWithElevatedPrivileges 块创建列表项。 在这种情况下,用户被冒充为系统帐户。

    相同的代码如下所示:

    SPSecurity.RunWithElevatedPrivileges(() =>
    {
        using (SPSite site = new SPSite(UrlText.Text))
        {
            using (SPWeb web = site.OpenWeb())
            {
                SPListItem item = web.Lists[ListName].AddItem();
                item["Title"] = "Item created with RunWithElevatedPriveleges";
                item.Update(); // Item will be created with System Account
    
                ShowData(web);
            }
        }
    });

    我们可以看到,新项目是使用系统帐户创建的,如下所示:

参考文献

摘要

在本文中,我们探讨了 SharePoint 2010 中的两种身份冒充方法。 附带的代码包含我们讨论的示例。

© . All rights reserved.