none
web程序中,通过RegistryKey来获取浏览器可信站点的安全级别和添加信任站点,部署到iis后失效

    问题

  • 1、得到当前信任站点的安全级别方法

    string info =string.Empty;

    string address = @"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\Zones\\2";

                    RegistryKey Key;
                    Key = Registry.CurrentUser;
                    RegistryKey myreg = Key.OpenSubKey(address, RegistryKeyPermissionCheck.ReadSubTree, System.Security.AccessControl.RegistryRights.FullControl);

                    info = myreg.GetValue("CurrentLevel").ToString();
                    myreg.Close();

    return info ;

    注:始终默认为浏览器信任站点初始设置的安全级别,在浏览器中设置后,在注册表文件中都会发生相应改变,但是获取的值却没有改变

    2、判断当前域名是否已经添加进信任站点方法

     bool flag = false;

    string hostname = this.txtDomainName.Text;//输入测试添加的站点,随便输入的
                    //string hostname = HttpContext.Current.Request.Url.Host;//当前域名
                    string address = @"SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\INTERNET SETTINGS\ZONEMAP\Domains";
                    string[] subkeyNames;
                    RegistryKey hkml = Registry.CurrentUser;//读取HKEY_CURRENT_USER
                    RegistryKey key1 = hkml.OpenSubKey(address, true);
                    subkeyNames = key1.GetSubKeyNames();
                    //判断当前浏览器是否添加了信任站点
                    foreach (string keyName in subkeyNames)
                    //遍历整个数组  
                    {
                        if (keyName == hostname)
                        //判断子项的名称  
                        {
                            flag = true;
                        }
                    }

                    hkml.Close();

    return flag ;

    3、、添加信任站点方法

     RegistryKey hkml = Registry.CurrentUser;//读取HKEY_CURRENT_USER
                    string address = @"SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\INTERNET SETTINGS\ZONEMAP\Domains";
                    //string hostname = HttpContext.Current.Request.Url.Host;//当前域名
                    string hostname = this.txtDomainName.Text;//输入测试添加的站点,随便输入的
                    RegistryKey key1 = hkml.OpenSubKey(address, true);
                    RegistryKey key2 = key1.CreateSubKey(hostname);

                    key2.SetValue("http", 0x2, RegistryValueKind.DWord);

                    key2.SetValue("https", 0x2, RegistryValueKind.DWord);//赋值

                    以上的3个方法在本地测试完全没有问题,能达到想要的效果,但是部署到IIS后能正常运行,但是却没有效果,在网上搜索了一下,说是iis权限问题,参考其设置后还是没有效果,百思不得其解,还请各位大侠高人指教,不胜感激(使用vs2008 +asp.net web form)!

    2015年12月26日 18:43

答案

  • 你好,丑九怪

    >>以上的3个方法在本地测试完全没有问题,能达到想要的效果,但是部署到IIS后能正常运行,但是却没有效果

    我猜测以上三个方法都是获取客户端数据的操作,由于你在本地VS运行时获取的是你当前程序运行的宿主的信息,也就是你本机的信息,所以是可以成功的。

    但是,如果发布到IIS之后,你将以客户端的角色向IIS发送请求,IIS接收请求并将相应信息发送到你的浏览器上。而以上代码将是获取IIS服务器的信息,并且因HTTP安全协议限制,IIS无权限访问客户端的信息。你可以设想,如果HTTP允许获取客户端信息,我们平时访问网站时,我们电脑里的数据就完全暴露了。

    由于你想要的浏览器的受信任站点的设置是客户端操作,所以,你不通过服务器端代码实现。你可以参考如下类似的帖子了解相关详情。

    http://forums.asp.net/t/1831773.aspx?Add+Trusted+Site+in+the+IIS+server

    另外,有关asp.net 的服务器端和客户端的区别,你可以参考下面的帖子。

    http://forums.asp.net/t/1368916.aspx?What+is+Client+Side+and+Server+Side+

    Best Regards,

    Albert Zhang

    2015年12月28日 5:38