identity

原创 2007年10月09日 17:25:00

 ============================================================
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 实用工具加密凭据和会话状态连接字符串

文章编号 : 329290
最后修改 : 2006年4月10日
修订 : 8.0
重要说明:本文包含有关如何修改注册表的信息。修改注册表之前,一定要先进行备份,并且一定要知道在发生问题时如何还原注册表。有关如何备份、还原和修改注册表的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986 (http://support.microsoft.com/kb/256986/) Microsoft Windows 注册表说明

概要

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

回到顶端

简介

使用 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

要使您所做的更改生效,必须重新启动 Microsoft Internet 信息服务 (IIS)。重新启动 IIS 时,会启动一个新的 ASP.NET 工作进程。要重新启动 IIS,请单击“开始”,单击“运行”,在“打开”框中键入 iisreset,然后单击“确定”。

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

回到顶端

更多信息

下载和运行 Aspnet_setreg.exe

可以从 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

回到顶端

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

警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。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 帐户授予权限

警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。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. 关闭注册表编辑器。

回到顶端

参考

有关允许您使用本文所述功能的修补程序的更多信息,请单击下面的文章编号,以查看 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 实用工具加密凭据和会话状态连接字符串

文章编号 : 329290
最后修改 : 2006年4月10日
修订 : 8.0
重要说明:本文包含有关如何修改注册表的信息。修改注册表之前,一定要先进行备份,并且一定要知道在发生问题时如何还原注册表。有关如何备份、还原和修改注册表的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986 (http://support.microsoft.com/kb/256986/) Microsoft Windows 注册表说明

概要

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

回到顶端

简介

使用 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

要使您所做的更改生效,必须重新启动 Microsoft Internet 信息服务 (IIS)。重新启动 IIS 时,会启动一个新的 ASP.NET 工作进程。要重新启动 IIS,请单击“开始”,单击“运行”,在“打开”框中键入 iisreset,然后单击“确定”。

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

回到顶端

更多信息

下载和运行 Aspnet_setreg.exe

可以从 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

回到顶端

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

警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。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 帐户授予权限

警告:如果使用注册表编辑器或其他方法错误地修改了注册表,则可能导致严重问题。这些问题可能需要重新安装操作系统才能解决。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. 关闭注册表编辑器。

回到顶端

参考

有关允许您使用本文所述功能的修补程序的更多信息,请单击下面的文章编号,以查看 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 页中已解密的配置信息。

先决条件

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

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

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

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

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

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

     

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

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

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

    注意

    因为将在本演练中使用 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"

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

加密 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> 子元素。

      复制代码
    <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 文件。

      复制代码
    <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 文件。

访问已加密的配置设置

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

查看已解密的配置值

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

    Visual Basic  复制代码
    <%@ 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#  复制代码
    <%@ 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 文件。

后续步骤

可以根据需要通过运行带有 -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"

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cxzhq2002/article/details/1817205

IDM, Identity, management

  • 2010年08月19日 15:53
  • 101KB
  • 下载

Sql Server数据库中Identity类型字段的使用

大家在创建数据库的时候肯定是经常使用Identity标识字段类型的。下面就介绍两个使用这种类型字段的小技巧。1.让标识字段从指定的数字开始计数:DBCC checkident (TableName,r...
  • Teng_s2000
  • Teng_s2000
  • 2007-05-12 14:39:00
  • 3536

论文笔记(一). Identity mapping in Deep Residual Networks

论文笔记(一). Identity mapping in Deep Residual Networks作者:Kaiming He,Xiaoyu Zhang,Shaoqing Ren ,and Jia...
  • a793620101
  • a793620101
  • 2016-11-18 19:26:18
  • 2389

ios no identity found 解决办法

xcode编译文件时老是报 no identity found错误 ,很坑爹啊。最后重启了下电脑就突然可以编译了。 然后按照以下3种方法试了下,解决了。 1. 删除电脑上已经存...
  • robinson_911
  • robinson_911
  • 2015-02-06 13:54:56
  • 2511

IDENTITY属性的使用详解

IDENTITY属性的使用1.创建查看IDENTITY 创建 IF OBJECT_ID('test','U') IS NOT NULL DROP TABLE test ...
  • xingerr
  • xingerr
  • 2017-06-25 11:57:41
  • 642

sql语句中有insert然后有个select@@identity,该怎么执行

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。 一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。 ...
  • lovemyself_0
  • lovemyself_0
  • 2017-03-15 10:52:46
  • 2280

SQL identity 使用汇总

1)IDENTITY(属性)(Transact-SQL) 在表中创建一个标识列。    此属性与 CREATE TABLE 和 ALTER TABLE Transact-SQL 语句一起...
  • macavalier
  • macavalier
  • 2013-10-14 13:37:46
  • 1361

SQL SERVER里@@identity 的用法

@@identity的作用是返回最后插入的标识值,所以有很多朋友使用它来获取插入数据后的标识符。但有一点是需要注意的,@@identity返回的是最后的标识符,所以,要想正确的返回插入后的标识符,那么...
  • kissqi
  • kissqi
  • 2008-07-22 19:55:00
  • 2364

VS2013中web项目中自动生成的ASP.NET Identity代码思考

vs2013没有再分webform、mvc、api项目,使用vs2013创建一个web项目模板选MVC,身份验证选个人用户账户。项目会生成ASP.NET Identity的一些代码。这些代码主要在Ac...
  • jurken
  • jurken
  • 2015-10-14 13:29:37
  • 3102

SQl server 如何获得新增的自增长字段IDde 值 使用select @@IDENTITY能快速解决,但是怎么使用呢?

select @@IDENTITY 的用法: 1.新增之后t添加语句;select @@IDENTITY 在insert 语句后面添加: INSERT INTO 表名称 VALUES (值1, 值...
  • ypz131023
  • ypz131023
  • 2017-03-17 16:25:53
  • 698
收藏助手
不良信息举报
您举报文章:identity
举报原因:
原因补充:

(最多只允许输入30个字)