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

通过代码进行模拟

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.36/5 (5投票s)

2007年3月8日

2分钟阅读

viewsIcon

32339

通过代码进行模拟

通过代码进行模拟

我正在阅读关于模拟和委托的内容。我发现模拟最常见的方式是在 web.config 文件中编写一个标签 "<impersonate = "true" username="Name" password ="password" />"。这将为每个请求模拟特定用户。我想仅为单个请求模拟网络用户。

在我的项目中,我必须创建一个在网络上共享的目录,并且该目录具有设置为网络用户的权限。如果我在 web.config 文件中使用模拟,我的应用程序的所有请求都将在该网络用户的权限下执行,这可能是一个安全威胁。我需要在一个请求中模拟用户,在该请求中我需要创建一个网络共享位置的目录。

以下代码模拟了 "Anonymous" 用户(在代码下方的段落中解释)。


HttpContext context = HttpContext.Current;

/* 从上下文中获取服务提供程序 */
IServiceProvider iServiceProvider = context as IServiceProvider;

/* 获取表示 HttpContext 的类型 */
Type httpWorkerRequestType = typeof(HttpWorkerRequest);

/* 从服务提供程序获取 HttpWorkerRequest 服务
注意:当尝试从 HttpContext 获取 HttpWorkerRequest 类型时,需要非托管代码权限。 */


HttpWorkerRequest httpWorkerRequest =
iServiceProvider.GetService(httpWorkerRequestType) as HttpWorkerRequest;

/* 获取 IIS 传递的令牌 */
IntPtr ptrUserToken = httpWorkerRequest.GetUserToken();

/* 从令牌创建一个 WindowsIdentity */
WindowsIdentity winIdentity = new WindowsIdentity(ptrUserToken);

Response.Write("模拟前: " + WindowsIdentity.GetCurrent().Name + "<br>");

/* 模拟用户 */
WindowsImpersonationContext impContext = winIdentity.Impersonate(); Response.Write("正在模拟: " + WindowsIdentity.GetCurrent().Name + "<br>");

/* 在此处放置资源访问代码
您可以编写用于文件访问、目录创建或删除文件或文件夹的代码 */



/* 停止模拟 */
impContext.Undo();

Response.Write("模拟后: " + WindowsIdentity.GetCurrent().Name + "<br>");

图 - (1) 使用代码模拟用户。

通过说 "Anonymous" 用户,指的是在 IIS 中为匿名帐户设置的用户。默认情况下,这将是 "IUser_MachineName"。通过输入用户名和密码并取消选中 "Allow IIS to control password" 复选框,将其更改为网络用户(或您要模拟的用户)。

为此,单击 "开始 –> 运行",然后写入 "inetmgr"。它将显示 IIS。右键单击您的应用程序的虚拟目录,然后选择属性。单击 "目录安全性" 选项卡。单击 "匿名访问和身份验证控制" 面板上的 "编辑" 按钮。在这里您可以更改用户名和密码。

编程愉快。

© . All rights reserved.