identity

 ============================================================
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;
using System.Windows.Forms;

[assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode = true)]
[assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]
public class ImpersonationDemo
{
    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
        int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

    [DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    private unsafe static extern int FormatMessage(int dwFlags, ref IntPtr lpSource,
        int dwMessageId, int dwLanguageId, ref String lpBuffer, int nSize, IntPtr* Arguments);

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

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
        int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);

    // Test harness.
    // If you incorporate this code into a DLL, be sure to demand FullTrust.
    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    public static void Main(string[] args)
    {
        IntPtr tokenHandle = new IntPtr(0);
        IntPtr dupeTokenHandle = new IntPtr(0);
        try
        {
            string userName, domainName;
            // Get the user token for the specified user, domain, and password using the
            // unmanaged LogonUser method. 
            // The local machine name can be used for the domain name to impersonate a user on this machine.
            Console.Write("Enter the name of the domain on which to log on: ");
            domainName = Console.ReadLine();

            Console.Write("Enter the login of a user on {0} that you wish to impersonate: ", domainName);
            userName = Console.ReadLine();

            Console.Write("Enter the password for {0}: ", userName);

            const int LOGON32_PROVIDER_DEFAULT = 0;
            //This parameter causes LogonUser to create a primary token.
            const int LOGON32_LOGON_INTERACTIVE = 2;

            tokenHandle = IntPtr.Zero;

            // Call LogonUser to obtain a handle to an access token.
            bool returnValue = LogonUser(userName, domainName, Console.ReadLine(),
                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                ref tokenHandle);

            Console.WriteLine("LogonUser called.");

            if (false == returnValue)
            {
                int ret = Marshal.GetLastWin32Error();
                Console.WriteLine("LogonUser failed with error code : {0}", ret);
                throw new System.ComponentModel.Win32Exception(ret);
            }

            Console.WriteLine("Did LogonUser Succeed? " + (returnValue ? "Yes" : "No"));
            Console.WriteLine("Value of Windows NT token: " + tokenHandle);

            // Check the identity.
            Console.WriteLine("Before impersonation: "
                + WindowsIdentity.GetCurrent().Name);
            // Use the token handle returned by LogonUser.
            WindowsIdentity newId = new WindowsIdentity(tokenHandle);
            WindowsImpersonationContext impersonatedUser = newId.Impersonate();

            // Check the identity.
            Console.WriteLine("After impersonation: "
                + WindowsIdentity.GetCurrent().Name);

            // Stop impersonating the user.
            impersonatedUser.Undo();

            // Check the identity.
            Console.WriteLine("After Undo: " + WindowsIdentity.GetCurrent().Name);

            // Free the tokens.
            if (tokenHandle != IntPtr.Zero)
                CloseHandle(tokenHandle);

        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception occurred. " + ex.Message);
        }

    }
}

========================================

15.2  用户账户模拟
15.2.1  一个模拟请求用户的例子
和以前的ASP不同,ASP.NET默认不模拟发出请求的用户。因此,可能发生以下情况。
·      由于ASP.NET系统账户默认权限不够高,不能执行一些对权限要求比较高的操作(比如磁盘访问、活动目录操作等)。
·      ASP.NET系统账户权限设置得过高,匿名用户都能执行“危险”操作。
我们可以通过开启模拟让ASP.NET以请求的账号来执行。一起来做一个试验。
1.新建一个ASPX页面,在Page_Load中我们输出请求标识和身份验证类型。(需要using System.Security.Principal;)。
protected void Page_Load(object sender, EventArgs e)
{
    WindowsIdentity userIdentity = WindowsIdentity.GetCurrent();
    WindowsPrincipal userPrincipal = new WindowsPrincipal(userIdentity);
    Response.Write(string.Format("当前用户标识:{0}<br/>" , userPrincipal.
    Identity.Name));
    Response.Write(string.Format("身份验证类型:{0}<br/>" , userPrincipal.
    Identity.AuthenticationType));
}
在页面上放置一个按钮控件和一个GridView控件。
<asp:Button ID="btn_GetFileList" runat="server" OnClick="btn_GetFileList_Click"
Text="获取文件列表" />
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
按钮控件的单击事件处理方法如下(需要using System.IO;):
protected void btn_GetFileList_Click(object sender, EventArgs e)
{
    DirectoryInfo di = new DirectoryInfo(@"d:/test");
    GridView1.DataSource = di.GetFiles();
    GridView1.DataBind();
}
可以看到,单击按钮后我们读取d盘的test目录的文件列表并绑定到GridView上进行呈现。
新建一个Web.config文件,配置如下:
<?xml version="1.0"?>
<configuration>
    <system.web>
        <identity impersonate="true"/> <!--开启模拟-->
    </system.web>
</configuration>
2.配置IIS,把程序所在的目录配置成一个虚拟目录,并且设置这个虚拟目录为关闭匿名访问,开启Windows集成验证,如图15-2所示。
注意:如果应用程序的虚拟目录上启用了匿名访问,则会模拟IUSR_MACHINENAME账户。
3.运行程序,单击“获取文件列表”按钮,如图15-3所示。
我们看到,当前模拟的用户为请求的用户(按Ctrl+Alt+Del组合键也可以看到当前登录的用户信息),由于当前请求的用户为本地的管理员(拥有操作本机d:/test的权限),GridView显示了目录下的所有文件信息。
4.右键单击“我的电脑”,选择“管理”,在本地用户和组下的用户文件夹中找到ASPNET用户,单击属性,如图15-4所示,我们可以看到ASPNET账户隶属于Users这个用户组。
注意:本章所有的例子都是以Windows XP操作系统(IIS 5.1)为例,对于IIS 6.0而言,ASP.NET的默认运行于NetworkService系统账户。
图15-2  配置虚拟目录
图15-3  以模拟方式运行
图15-4  ASPNET账户隶属于Users用户组
那么再来看一下d:/test文件夹的权限,如图15-5所示。
可以看到,Users用户组不具有对这个文件夹的任何权限。那么,如果我们关闭模拟,ASP.NET页面以ASPNET系统账户来执行的话应该就没有权限访问test文件夹了。设置<identity impersonate="false"/>, 然后重新运行页面,如图15-6所示。
                
图15-5  文件夹的权限                                  图15-6  关闭账户模拟
单击“获取文件列表”按钮后出现如图15-7所示的异常。
图15-7  ASPNET账户对文件夹的访问被拒绝
如图15-8所示,给test文件夹添加ASPNET系统账户并赋予读取和运行权限。
图15-8  赋予ASPNET系统账户对文件夹的操作权限
重新运行页面后能正常获取文件列表了,如图15-9所示。
图15-9  模拟请求用户
15.2.2  模拟某一个用户
如果你的Web服务器上有多个ASP.NET应用程序,或者你的ASP.NET应用程序需要更高的权限以执行特殊的操作,那么可以为程序设置一个单独的账户。
<?xml version="1.0"?>
<configuration>
    <system.web>
        <identity impersonate="true"
              userName="域/机器名"
              password="密码"
              />
  </system.web>
</configuration>
在这里,你可以用明文设置用户名和密码,对此就不做过多解释了。需要特别注意的是,你设置的账户需要对以下目录拥有权限:
·      ASP.NET临时文件夹。这是ASP.NET动态编译的位置,需要有读写权限。
·      全局程序集缓存(%Windir%/assembly)。这是全局程序集缓存,需要有读取权限。
注意:如果正在运行Windows Server 2003,其中的IIS 6.0配置为运行在辅助进程隔离模式下(默认情况),则可通过将ASP.NET应用程序配置为在自定义应用程序池(在特定的域标识下运行)中运行,然后使用指定的域标识访问资源而无需使用模拟。
15.2.3  使用编程方式进行临时模拟
有的时候可能希望暂时模拟经过身份验证的调用方,可以使用代码进行临时模拟。
1.把先前Page_Load里面的代码封装成一个私有方法并删除Page_Load中的代码。
private void GetIdentityInfo()
{
    WindowsIdentity userIdentity = WindowsIdentity.GetCurrent();
    WindowsPrincipal userPrincipal = new WindowsPrincipal(userIdentity);
    Response.Write(string.Format("系统用户标识:{0}<br/>", userPrincipal.
    Identity.Name));
    Response.Write(string.Format("身份验证类型:{0}<br/>", userPrincipal.
    Identity.AuthenticationType));
}
2.修改“获取文件列表”按钮的单击事件处理方法。
protected void btn_GetFileList_Click(object sender, EventArgs e)
{
    GetIdentityInfo();
    WindowsIdentity userIdentity = (WindowsIdentity)User.Identity;
    WindowsPrincipal userPrincipal = new WindowsPrincipal(userIdentity);
    WindowsImpersonationContext ctx = null;
    try
    {
        Response.Write("模拟开始<br/>");
        ctx = userIdentity.Impersonate();
        GetIdentityInfo();
        DirectoryInfo di = new DirectoryInfo(@"d:/test");
        GridView1.DataSource = di.GetFiles();
        GridView1.DataBind();
    }
    catch
    {
    }
    finally
    {
        Response.Write("模拟结束<br/>");
        if (ctx != null)
            ctx.Undo();
        GetIdentityInfo();
    }
}
我们看到,输出了三次当前用户标识,分别是开始模拟以前,模拟以后和恢复不模拟以后。
3.重新运行程序之前首先修改Web.config文件禁止模拟,然后禁止ASPNET账户对d:/test文件夹的读取权限。运行结果如图15-10所示。
我们看到,虽然在Web.config中禁止了模拟,并且ASPNET账户对文件夹没有读取权限。但是通过编程方式我们临时模拟请求用户成功执行了进行文件夹操作。
图15-10  临时模拟

 

===============================

    // Get the Web application configuration.
    System.Configuration.Configuration configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/Test");
    // Get the identity section.
    IdentitySection identity = (System.Web.Configuration.IdentitySection)configuration.GetSection("system.web/identity");

    identity.UserName = "makehtml";
    identity.Password = "123";
    identity.Impersonate = true;

 

===================

http://support.microsoft.com/kb/329290/zh-cn

+++++++++++++++++

如何使用 ASP.NET 实用工具加密凭据和会话状态连接字符串

<script type="text/javascript">function loadTOCNode(){}</script>
文章编号:329290
最后修改:2006年4月10日
修订:8.0
重要说明:本文包含有关如何修改注册表的信息。修改注册表之前,一定要先进行备份,并且一定要知道在发生问题时如何还原注册表。有关如何备份、还原和修改注册表的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986 (http://support.microsoft.com/kb/256986/) Microsoft Windows 注册表说明
<script type="text/javascript"> var sectionFilter = "type != 'notice' && type != 'securedata' && type != 'querywords'"; var tocArrow = "/library/images/support/kbgraphics/public/en-us/downarrow.gif"; var depthLimit = 10; var depth3Limit = 10; var depth4Limit = 5; var depth5Limit = 3; var tocEntryMinimum = 1; </script><script src="/common/script/gsfx/kbtoc.js?9" type="text/javascript"></script>

概要

<script type="text/javascript">loadTOCNode(1, 'summary');</script>
本文分步介绍如何使用 Aspnet_setreg.exe 实用工具加密凭据和会话状态连接字符串。如果您想完成下列任一操作,Microsoft ASP.NET 版本 1.0 都会要求您将纯文本凭据存储在配置文件中:
更改 ASP.NET 工作进程标识。
指定一个模拟标识。
指定一个用于会话状态的连接字符串。
当您应用 Microsoft 知识库文章 329250(见“参考”)中介绍的修补程序时,您可以使用存储在注册表中的加密数据而不是使用下列配置节中的纯文本内容:
<identity userName= password= />
<processModel userName= password= />
<sessionState stateConnectionString= sqlConnectionString= />

回到顶端

简介

<script type="text/javascript">loadTOCNode(2, 'summary');</script>使用 Aspnet_setreg.exe 实用工具将这些属性值加密并存储到注册表中一个安全的项下。使用带 CRYPTPROTECT_LOCAL_MACHINE 标志的 CryptProtectData 函数加密凭据。由于任何人只要具有访问此计算机的权限就可以调用 CryptUnprotectData,因此,加密的数据被存储在一个安全的、具有严格自由访问控制列表 (DACL) 的注册表项下面。当 ASP.NET 分析配置文件时,它将读取此安全的注册表项,然后使用 CryptUnprotectData 来解密数据。

在 System 标识下运行的 Inetinfo.exe 读取 <processModel /> 部分。要读取存储 ASP.NET 辅助进程用户名和密码的注册表项,System 帐户必须具有对这些项的“读取”权限。

ASP.NET 辅助进程 (Aspnet_wp.exe) 读取 <identity /> 和 <sessionState /> 部分。要读取这些注册表项,辅助进程帐户必须具有对这些项的“读取”权限。如果内容存放在“通用命名约定”(UNC) 共享上,则用于访问 UNC 共享的帐户必须具有对这些项的读取权限。

默认情况下,Aspnet_setreg.exe 创建的注册表项向 System、Administrator 和 Creator Owner 帐户授予完全控制权。您可以使用 Regedt32.exe 修改注册表项上的 DACL。应确保任意用户不能读取注册表项。
重新启动 IIS
<script type="text/javascript">loadTOCNode(3, 'summary');</script>要使您所做的更改生效,必须重新启动 Microsoft Internet 信息服务 (IIS)。重新启动 IIS 时,会启动一个新的 ASP.NET 工作进程。要重新启动 IIS,请单击“开始”,单击“运行”,在“打开”框中键入 iisreset,然后单击“确定”。

注意:如果重新配置的服务器是域控制器,则可能必须重新启动该服务器。

回到顶端

更多信息

<script type="text/javascript">loadTOCNode(1, 'moreinformation');</script>

下载和运行 Aspnet_setreg.exe

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script>可以从 Microsoft 下载中心下载以下文件:

下载 立即下载 Aspnet_setreq.exe 程序包。 (http://download.microsoft.com/download/2/9/8/29829651-e0f0-412e-92d0-e79da46fd7a5/aspnet_setreg.exe)
发布日期:2003 年 4 月 11 日

有关如何下载 Microsoft 支持文件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591 (http://support.microsoft.com/kb/119591/) 如何从联机服务获取 Microsoft 支持文件
Microsoft 已对此文件进行了病毒扫描。Microsoft 使用的是该文件发布时可以获得的最新病毒检测软件。该文件存储在安全性得到增强的服务器上,以防止在未经授权的情况下对其进行更改。

要显示所有可用的命令行参数及其用法,请在命令提示符下不使用任何命令行参数运行此工具。如果已将此工具保存在 C:/Tools/ 中,请从命令提示符处运行以下命令,以显示该工具的所有可用开关及有关这些开关的帮助:
C:/Tools>aspnet_setreg.exe

回到顶端

在配置文件中使用加密的属性

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> 警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。Microsoft 不能保证您可以解决这些问题。修改注册表需要您自担风险。

注意:该工具在 HKEY_LOCAL_MACHINE 子树下创建注册表项。默认情况下,只有管理员才能在此子树下创建项。确保您以管理员的身份登录,以便成功创建这些注册表项。
1.加密将与 <identity> 部分一起使用的 userNamepassword 属性。(您也可以将此操作过程用于本文中提及的其他部分。)为此,请在命令行上键入以下命令:
c:/Tools>aspnet_setreg.exe -k:SOFTWARE/MY_SECURE_APP/identity -u:"yourdomainname/username" -p:"password"
该命令加密 userNamepassword 属性,并在指定的任何位置创建注册表项,然后将这些属性存储在那些注册表项中。此命令还可以生成输出内容,此内容指定如何更改您的 Web.config 或 Machine.config 文件,以便 ASP.NET 使用这些项从注册表中读取信息。

执行此命令之后,您将收到类似于下面的输出内容:
请编辑您的配置文件以包含以下内容:

userName="registry:HKLM/SOFTWARE/MY_SECURE_APP/identity/ASPNET_SETREG,userName"
password="registry:HKLM/SOFTWARE/MY_SECURE_APP/identity/ASPNET_SETREG,password"

注册表项的 DACL 向 System、Administrators 和 Creator Owner 授予完全控制权限。

如果已经为 <identity/> 配置节加密了凭据,或者为
<sessionState/> 配置节加密了连接字符串,则确保该进程标识具有
对注册表项的“读取”权限。而且,如果您已经相应地配置 IIS 来访问存储在
UNC 共享上的内容,那么访问此共享的用户帐户需要具有对注册表项的“读取”权限。
Regedt32.exe 可以用来查看或修改注册表项权限。

您可以重命名注册表子项和注册表值来避免被发现。
2.请修改相应的配置文件使之指向这些注册表项。如果必须在 <identity> 节中使用这些值,则得到的 <identity> 节将类似如下内容。
<identity impersonate="true"
userName="registry:HKLM/SOFTWARE/MY_SECURE_APP/identity/ASPNET_SETREG,userName"
password="registry:HKLM/SOFTWARE/MY_SECURE_APP/identity/ASPNET_SETREG,password" />
					
3.向 Aspnet_wp.exe 进程帐户授予“读取”权限。有关如何更改注册表项权限的更多信息,请参见“使用 Regedt32.exe 在这些注册表项中为 ASP.NET 帐户授予权限”一节。

回到顶端

使用 Regedt32.exe 在这些注册表项中为 ASP.NET 帐户授予权限

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> 警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。Microsoft 不能保证您可以解决这些问题。修改注册表需要您自担风险。
1.单击“开始”,单击“运行”,在“打开”框中键入 regedt32,然后单击“确定”。
2.单击 HKEY_LOCAL_MACHINE/SOFTWARE/MY_SECURE_APP/ 子项。
3.在“安全性”菜单上,单击“权限”,以打开“权限”对话框。

在 Microsoft Windows XP 或 Windows Server 2003 上,右键单击该注册表项,然后单击“权限”。
4.单击“添加”。在打开的对话框中,键入 yourservername/ASPNET(如果使用 Windows Server 2003 (IIS 6.0),则键入 yourservername/NetWork Service),然后单击“确定”。
5.确保刚才添加的帐户具有“读取”权限,然后单击“确定”。
6.关闭注册表编辑器。

回到顶端

参考

<script type="text/javascript">loadTOCNode(1, 'references');</script>
有关允许您使用本文所述功能的修补程序的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
329250 (http://support.microsoft.com/kb/329250/) FIX:用于 processModel、标识和 sessionState 的更强凭据
有关 Microsoft Windows 注册表的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986 (http://support.microsoft.com/kb/256986/) Microsoft Windows 注册表说明
有关 ASP.NET 的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
315158 (http://support.microsoft.com/kb/315158/) FIX:ASP.NET 在域控制器上使用默认 ASPNET 帐户不能正常运行
317012 (http://support.microsoft.com/kb/317012/) ASP.NET 中的进程和请求标识

回到顶端

如何使用 ASP.NET 实用工具加密凭据和会话状态连接字符串

<script type="text/javascript">function loadTOCNode(){}</script>
文章编号:329290
最后修改:2006年4月10日
修订:8.0
重要说明:本文包含有关如何修改注册表的信息。修改注册表之前,一定要先进行备份,并且一定要知道在发生问题时如何还原注册表。有关如何备份、还原和修改注册表的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986 (http://support.microsoft.com/kb/256986/) Microsoft Windows 注册表说明
<script type="text/javascript"> var sectionFilter = "type != 'notice' && type != 'securedata' && type != 'querywords'"; var tocArrow = "/library/images/support/kbgraphics/public/en-us/downarrow.gif"; var depthLimit = 10; var depth3Limit = 10; var depth4Limit = 5; var depth5Limit = 3; var tocEntryMinimum = 1; </script><script src="/common/script/gsfx/kbtoc.js?9" type="text/javascript"></script>

概要

<script type="text/javascript">loadTOCNode(1, 'summary');</script>
本文分步介绍如何使用 Aspnet_setreg.exe 实用工具加密凭据和会话状态连接字符串。如果您想完成下列任一操作,Microsoft ASP.NET 版本 1.0 都会要求您将纯文本凭据存储在配置文件中:
更改 ASP.NET 工作进程标识。
指定一个模拟标识。
指定一个用于会话状态的连接字符串。
当您应用 Microsoft 知识库文章 329250(见“参考”)中介绍的修补程序时,您可以使用存储在注册表中的加密数据而不是使用下列配置节中的纯文本内容:
<identity userName= password= />
<processModel userName= password= />
<sessionState stateConnectionString= sqlConnectionString= />

回到顶端

简介

<script type="text/javascript">loadTOCNode(2, 'summary');</script>使用 Aspnet_setreg.exe 实用工具将这些属性值加密并存储到注册表中一个安全的项下。使用带 CRYPTPROTECT_LOCAL_MACHINE 标志的 CryptProtectData 函数加密凭据。由于任何人只要具有访问此计算机的权限就可以调用 CryptUnprotectData,因此,加密的数据被存储在一个安全的、具有严格自由访问控制列表 (DACL) 的注册表项下面。当 ASP.NET 分析配置文件时,它将读取此安全的注册表项,然后使用 CryptUnprotectData 来解密数据。

在 System 标识下运行的 Inetinfo.exe 读取 <processModel /> 部分。要读取存储 ASP.NET 辅助进程用户名和密码的注册表项,System 帐户必须具有对这些项的“读取”权限。

ASP.NET 辅助进程 (Aspnet_wp.exe) 读取 <identity /> 和 <sessionState /> 部分。要读取这些注册表项,辅助进程帐户必须具有对这些项的“读取”权限。如果内容存放在“通用命名约定”(UNC) 共享上,则用于访问 UNC 共享的帐户必须具有对这些项的读取权限。

默认情况下,Aspnet_setreg.exe 创建的注册表项向 System、Administrator 和 Creator Owner 帐户授予完全控制权。您可以使用 Regedt32.exe 修改注册表项上的 DACL。应确保任意用户不能读取注册表项。
重新启动 IIS
<script type="text/javascript">loadTOCNode(3, 'summary');</script>要使您所做的更改生效,必须重新启动 Microsoft Internet 信息服务 (IIS)。重新启动 IIS 时,会启动一个新的 ASP.NET 工作进程。要重新启动 IIS,请单击“开始”,单击“运行”,在“打开”框中键入 iisreset,然后单击“确定”。

注意:如果重新配置的服务器是域控制器,则可能必须重新启动该服务器。

回到顶端

更多信息

<script type="text/javascript">loadTOCNode(1, 'moreinformation');</script>

下载和运行 Aspnet_setreg.exe

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script>可以从 Microsoft 下载中心下载以下文件:

下载 立即下载 Aspnet_setreq.exe 程序包。 (http://download.microsoft.com/download/2/9/8/29829651-e0f0-412e-92d0-e79da46fd7a5/aspnet_setreg.exe)
发布日期:2003 年 4 月 11 日

有关如何下载 Microsoft 支持文件的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591 (http://support.microsoft.com/kb/119591/) 如何从联机服务获取 Microsoft 支持文件
Microsoft 已对此文件进行了病毒扫描。Microsoft 使用的是该文件发布时可以获得的最新病毒检测软件。该文件存储在安全性得到增强的服务器上,以防止在未经授权的情况下对其进行更改。

要显示所有可用的命令行参数及其用法,请在命令提示符下不使用任何命令行参数运行此工具。如果已将此工具保存在 C:/Tools/ 中,请从命令提示符处运行以下命令,以显示该工具的所有可用开关及有关这些开关的帮助:
C:/Tools>aspnet_setreg.exe

回到顶端

在配置文件中使用加密的属性

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> 警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。Microsoft 不能保证您可以解决这些问题。修改注册表需要您自担风险。

注意:该工具在 HKEY_LOCAL_MACHINE 子树下创建注册表项。默认情况下,只有管理员才能在此子树下创建项。确保您以管理员的身份登录,以便成功创建这些注册表项。
1.加密将与 <identity> 部分一起使用的 userNamepassword 属性。(您也可以将此操作过程用于本文中提及的其他部分。)为此,请在命令行上键入以下命令:
c:/Tools>aspnet_setreg.exe -k:SOFTWARE/MY_SECURE_APP/identity -u:"yourdomainname/username" -p:"password"
该命令加密 userNamepassword 属性,并在指定的任何位置创建注册表项,然后将这些属性存储在那些注册表项中。此命令还可以生成输出内容,此内容指定如何更改您的 Web.config 或 Machine.config 文件,以便 ASP.NET 使用这些项从注册表中读取信息。

执行此命令之后,您将收到类似于下面的输出内容:
请编辑您的配置文件以包含以下内容:

userName="registry:HKLM/SOFTWARE/MY_SECURE_APP/identity/ASPNET_SETREG,userName"
password="registry:HKLM/SOFTWARE/MY_SECURE_APP/identity/ASPNET_SETREG,password"

注册表项的 DACL 向 System、Administrators 和 Creator Owner 授予完全控制权限。

如果已经为 <identity/> 配置节加密了凭据,或者为
<sessionState/> 配置节加密了连接字符串,则确保该进程标识具有
对注册表项的“读取”权限。而且,如果您已经相应地配置 IIS 来访问存储在
UNC 共享上的内容,那么访问此共享的用户帐户需要具有对注册表项的“读取”权限。
Regedt32.exe 可以用来查看或修改注册表项权限。

您可以重命名注册表子项和注册表值来避免被发现。
2.请修改相应的配置文件使之指向这些注册表项。如果必须在 <identity> 节中使用这些值,则得到的 <identity> 节将类似如下内容。
<identity impersonate="true"
userName="registry:HKLM/SOFTWARE/MY_SECURE_APP/identity/ASPNET_SETREG,userName"
password="registry:HKLM/SOFTWARE/MY_SECURE_APP/identity/ASPNET_SETREG,password" />
					
3.向 Aspnet_wp.exe 进程帐户授予“读取”权限。有关如何更改注册表项权限的更多信息,请参见“使用 Regedt32.exe 在这些注册表项中为 ASP.NET 帐户授予权限”一节。

回到顶端

使用 Regedt32.exe 在这些注册表项中为 ASP.NET 帐户授予权限

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> 警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。Microsoft 不能保证您可以解决这些问题。修改注册表需要您自担风险。
1.单击“开始”,单击“运行”,在“打开”框中键入 regedt32,然后单击“确定”。
2.单击 HKEY_LOCAL_MACHINE/SOFTWARE/MY_SECURE_APP/ 子项。
3.在“安全性”菜单上,单击“权限”,以打开“权限”对话框。

在 Microsoft Windows XP 或 Windows Server 2003 上,右键单击该注册表项,然后单击“权限”。
4.单击“添加”。在打开的对话框中,键入 yourservername/ASPNET(如果使用 Windows Server 2003 (IIS 6.0),则键入 yourservername/NetWork Service),然后单击“确定”。
5.确保刚才添加的帐户具有“读取”权限,然后单击“确定”。
6.关闭注册表编辑器。

回到顶端

参考

<script type="text/javascript">loadTOCNode(1, 'references');</script>
有关允许您使用本文所述功能的修补程序的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
329250 (http://support.microsoft.com/kb/329250/) FIX:用于 processModel、标识和 sessionState 的更强凭据
有关 Microsoft Windows 注册表的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986 (http://support.microsoft.com/kb/256986/) Microsoft Windows 注册表说明
有关 ASP.NET 的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
315158 (http://support.microsoft.com/kb/315158/) FIX:ASP.NET 在域控制器上使用默认 ASPNET 帐户不能正常运行
317012 (http://support.microsoft.com/kb/317012/) ASP.NET 中的进程和请求标识

回到顶端

=========================================================

供有关加密 ASP.NET 应用程序配置文件的节的逐步骤示例。

由于能对存储在 Web.config 文件中的敏感信息进行加密,“受保护的配置”有助于提高应用程序的安全性。可以使用 aspnet_regiis.exe 对 Web.config 文件的节进行加密并管理加密密钥。ASP.NET 在处理文件时对配置文件进行解密。因此,解密不需要任何附加代码。有关受保护的配置的更多信息,请参见使用受保护的配置加密配置信息

在本演练中,您将学会如何执行以下任务:

  • 使用默认“受保护配置”提供程序对 Web.config 文件的节进行加密。

  • 访问 ASP.NET 页中已解密的配置信息。

Collapse 图像先决条件

若要完成本演练,您需要:

Collapse 图像授予对 RSA 加密密钥的读取权限

ASP.NET 应用程序的标识必须能读取用于加密和解密已加密节的加密密钥,才能对 Web.config 文件中的已加密信息进行解密。此演练使用 Machine.config 文件中指定的名为 "RsaProtectedConfigurationProvider" 的默认 RsaProtectedConfigurationProvider 提供程序。默认 RsaProtectedConfigurationProvider 提供程序使用的 RSA 密钥容器名为 "NetFrameworkConfigurationKey"

授予 ASP.NET 标识对默认 RSA 密钥容器的读取权限

  1. 打开文本编辑器,然后将下面的代码复制到一个新文件中。

    Visual Basic CopyCode image复制代码
    <%@ Page Language="VB" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name)
    %>

     

    C# CopyCode image复制代码
    <%@ Page Language="C#" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
    %>
  2. 在应用程序目录中将该文件另存为 “identity.aspx”

  3. 若要确定 ASP.NET 应用程序的标识,请在浏览器中打开 identity.aspx。

    浏览器中将显示 ASP.NET 应用程序的模拟标识。

    Note注意

    因为将在本演练中使用 IIS,所以不要对您的站点身份验证使用模拟。即只对该演练使用匿名身份验证作为 ASP.NET 应用程序的标识。如果应用程序的标识为目前登录的用户 ID(如 DOMAIN/myuserid),请在应用程序的 Web.config 文件中禁用模拟。若要在 Web.config 文件中禁用模拟,请打开 Web.config 文件,然后移除 <identity> 元素。移除 <identity> 元素后,请更新浏览器中的 identity.aspx 以显示修改后的应用程序标识。

  4. 在命令提示处,运行带有下列选项的 aspnet_regiis.exe:

    • -pa 选项,后面跟默认 RsaProtectedConfigurationProvider 的 RSA 密钥容器的名称。

    • 在前一步中确定的 ASP.NET 应用程序的标识。

    例如,下面的命令授予 NETWORK SERVICE 帐户对计算机级别的 "NetFrameworkConfigurationKey" RSA 密钥容器的访问权限。

    aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"

    请勿关闭“命令提示”窗口。

Collapse 图像加密 Web.config 文件的节

既然 ASP.NET 应用程序的标识能够读取默认 RsaProtectedConfigurationProvider 对象的 RSA 密钥容器,就可以使用该密钥容器对 ASP.NET 应用程序的 Web.config 文件的节进行加密。然后,ASP.NET 在处理 Web.config 文件时会对这些节进行解密。

加密 Web.config 文件的 <connectionStrings> 和 <machineKey> 节

  1. 在文本编辑器中,打开应用程序的 Web.config 文件。

    • 如果没有 ASP.NET 应用程序的 Web.config 文件,请打开文本编辑器并将示例配置复制到一个新文件中,然后在 ASP.NET 应用程序目录中将该文件另存为 “web.config”

  2. 如下面的实例所示,确保 <system.web><connectionStrings> 子元素和 <machineKey> 子元素。

     CopyCode image复制代码
    <configuration>
       <connectionStrings>
          <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
       </connectionStrings>
    
       <system.web>
    
         <machineKey validationKey="D61B3C89CB33A2F1422FF158AFF7320E8DB8CB5CDA1742572A487D94018787EF42682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"
           decryptionKey="FBF50941F22D6A3B229EA593F24C41203DA6837F1122EF17" />
    
       </system.web>
    </configuration>
  3. 关闭 Web.config 文件。

  4. 在命令提示处,通过键入以下命令将目录更改为 .NET Framework 2.0 版目录:

    cd /WINDOWS/Microsoft.Net/Framework/v2.0.*

  5. 在命令提示处,运行带有下列选项的 aspnet_regiis.exe:

    • -pe 选项和字符串 "connectionStrings" 用于对应用程序的 Web.config 文件的 connectionStrings 元素进行加密。

    • -app 选项和应用程序的名称。

    例如,下面的命令将加密 MyApplication 应用程序的 Web.config 文件的 <connectionStrings> 节。

    aspnet_regiis -pe "connectionStrings" -app "/MyApplication"

  6. 对于 <system.web> 元素的 <machineKey> 子元素重复上述步骤,如下面的示例所示:

    aspnet_regiis -pe "system.web/machineKey" -app "/MyApplication"

    请勿关闭“命令提示”窗口。

  7. 打开 Web.config 文件并查看已加密的内容。

    内容看上去类似于下面的示例 Web.config 文件。

     CopyCode image复制代码
    <configuration>
    
       <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
          <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
             xmlns="http://www.w3.org/2001/04/xmlenc#">
             <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
             <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
                   <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
                   <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                      <KeyName>RSA Key
                      </KeyName>
                   </KeyInfo>
                   <CipherData>
                      <CipherValue>WcFEbDX8VyLfAsVK8g6hZVAG1674ZFc1kWH0BoazgOwdBfinhcAmQmnIn0oHtZ5tO2EXGl+dyh10giEmO9NemH4YZk+iMIln+ItcEay9CGWMXSen9UQLpcQHQqMJErZiPK4qPZaRWwqckLqriCl9X8x9OE7jKIsO2Ibapwj+1Jo=
                      </CipherValue>
                   </CipherData>
                </EncryptedKey>
             </KeyInfo>
             <CipherData>
                <CipherValue>OpWQgQbq2wBZEGYAeV8WF82yz6q5WNFIj3rcuQ8gT0MP97aO9SHIZWwNggSEi2Ywi4oMaHX9p0NaJXG76aoMR9L/WasAxEwzQz3fexFgFSrGPful/5txSPTAGcqUb1PEBVlB9CA71UXIGVCPTiwF7zYDu8sSHhWa0fNXqVHHdLQYy1DfhXS3cO61vW5e/KYmKOGA4mjqT0VZaXgb9tVeGBDhjPh5ZlrLMNfYSozeJ+m2Lsm7hnF6VvFm3fFMXa6+h0JTHeCXBdmzg/vQb0u3oejSGzB4ly+V9O0T4Yxkwn9KVDW58PHOeRT2//3iZfJfWV2NZ4e6vj4Byjf81o3JVNgRjmm9hr9blVbbT3Q8/j5zJ+TElCn6zPHvnuB70iG2KPJXqAj2GBzBk6cHq+WNebOQNWIb7dTPumuZK0yW1XDZ5gkfBuqgn8hmosTE7mCvieP9rgATf6qgLgdA6zYyVV6WDjo1qbCV807lczxa3bF5KzKaVUSq5FS1SpdZKAE6/kkr0Ps++CE=
                </CipherValue>
             </CipherData>
          </EncryptedData>
       </connectionStrings>
    
       <system.web>
         <machineKey configProtectionProvider="RsaProtectedConfigurationProvider">
           <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
             xmlns="http://www.w3.org/2001/04/xmlenc#">
             <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
             <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
               <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
                 <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
                 <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                   <KeyName>RSA Key
                   </KeyName>
                 </KeyInfo>
                 <CipherData>
                   <CipherValue>IwUopItbWX0mJdGWtAqE1LlsG3u5RBRlAXs9/GZj3HEfeUXduHVF76q6Ip88YqlfLthH+DMBYdOZAF+hCOmS2agfTo1tKUvELRGIljS/BqEYxUO+/IOz9tllAw8ZlGF7AVCzptgIejI+iLXEZfMKW7f6EMGeb5vaaKXHIkYZwcM=
                   </CipherValue>
                 </CipherData>
               </EncryptedKey>
             </KeyInfo>
             <CipherData>
               <CipherValue>ivVyERVPNUzIb/i7/NUbRkxsxh8IG959vycwrzJO0vYWxHZ5i03SfrLbsGUV17+FxZ6lbcrVaF5FY3zVm7dRMRvQpVFwaVcL
               </CipherValue>
             </CipherData>
           </EncryptedData>
         </machineKey>
    
       </system.web>
    </configuration>
  8. 关闭 Web.config 文件。

Collapse 图像访问已加密的配置设置

ASP.NET 在处理 Web.config 文件时会自动对该文件的内容进行解密。因此,不需要任何附加步骤即可对已加密的配置设置进行解密,供其他 ASP.NET 功能使用或用于访问代码中的值。但是,若要查看已解密的设置,您可以遵循下面的步骤操作。

查看已解密的配置值

  1. 打开文本编辑器,然后将下面的 ASP.NET 代码复制到一个新文件中。

    Visual Basic CopyCode image复制代码
    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Configuration" %>
    <%@ Import Namespace="System.Web.Configuration" %>
    <script runat="server">
    
    Public Sub Page_Load()
    
      ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings
      ConnectionStringsGrid.DataBind()
    
      Dim config As System.Configuration.Configuration = _
        WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath)
      Dim key As MachineKeySection = _
        CType(config.GetSection("system.web/machineKey"), MachineKeySection)
      DecryptionKey.Text = key.DecryptionKey
      ValidationKey.Text = key.ValidationKey
    
    End Sub
    
    </script>
    <html>
    
    <body>
    
    <form runat="server">
    
      <asp:GridView runat="server" CellPadding="4" id="ConnectionStringsGrid" />
      <P>
      MachineKey.DecryptionKey = <asp:Label runat="Server" id="DecryptionKey" /><BR>
      MachineKey.ValidationKey = <asp:Label runat="Server" id="ValidationKey" />
    
    </form>
    
    </body>
    </html>

     

    C# CopyCode image复制代码
    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Configuration" %>
    <%@ Import Namespace="System.Web.Configuration" %>
    <script runat="server">
    
    public void Page_Load()
    {
      ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings;
      ConnectionStringsGrid.DataBind();
    
      Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
      MachineKeySection key = 
        (MachineKeySection)config.GetSection("system.web/machineKey");
      DecryptionKey.Text = key.DecryptionKey;
      ValidationKey.Text = key.ValidationKey;
    }
    
    </script>
    <html>
    
    <body>
    
    <form runat="server">
    
      <asp:GridView runat="server" CellPadding="4" id="ConnectionStringsGrid" />
      <P>
      MachineKey.DecryptionKey = <asp:Label runat="Server" id="DecryptionKey" /><BR>
      MachineKey.ValidationKey = <asp:Label runat="Server" id="ValidationKey" />
    
    </form>
    
    </body>
    </html>
  2. 将该文件另存为 “walkthrough.aspx”,然后在浏览器中查看该文件。

    您将看到加密的 Web.config 文件中已解密的值。

  3. 若要保持网站上敏感信息的私密性,请在完成此演练时删除 walkthrough.aspx 文件。

Collapse 图像后续步骤

可以根据需要通过运行带有 -pd 选项的 aspnet_regiis.exe 对已加密的 Web.config 文件内容进行解密。语法与使用 -pe 选项对 Web.config 文件内容进行加密的语法相同,区别在于无需指定“受保护配置”提供程序。相应的提供程序使用 protected 节的 configProtectionProvider 元素标识。例如,下面的命令在名为 MyApplication 的 ASP.NET 应用程序的 Web.config 文件中对 <connectionStrings> 元素和 <system.web> 元素的 <machineKey> 子元素进行解密。

aspnet_regiis -pd "connectionStrings" -app "/MyApplication"

aspnet_regiis -pd "system.web/machineKey" -app "/MyApplication"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值