且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Web服务器中的WebBrowser控件未从网站返回Cookie

更新时间:2023-12-01 23:46:16

添加了自定义安全管理器之后,仍然没有成功:

After adding a custom Security Manager, and still not having success:

public partial  class InternetSecurityManager : IInternetSecurityManager
{
    private static Guid _CLSID_SecurityManager = new Guid("7b8a2d94-0ac9-11d1-896c-00c04fb6bfc4");
    private static string[] ZoneNames = new[] { "Local", "Intranet", "Trusted", "Internet", "Restricted" };public static string GetUrlZone(string url)
    { 
        Type t = System.Type.GetTypeFromCLSID(_CLSID_SecurityManager);
        IInternetSecurityManager securityManager = (IInternetSecurityManager)System.Activator.CreateInstance(t);
        try
        {
            uint zone = 0;
            int hResult = securityManager.MapUrlToZone(url, ref zone, 0);
            if (hResult != 0)
                throw new COMException("Error calling MapUrlToZone, HRESULT = " + hResult.ToString("x"), hResult);

            if (zone < ZoneNames.Length)
                return ZoneNames[zone];
            return "Unknown - " + zone;
        }
        finally
        {
            Marshal.ReleaseComObject(securityManager);
        }
    }
    public static void GetUrlZoneCookiesPermissions(string url)
    {
        Type t = System.Type.GetTypeFromCLSID(_CLSID_SecurityManager);
        IInternetSecurityManager securityManager = (IInternetSecurityManager)System.Activator.CreateInstance(t);
        try
        { 
            uint puaf = 0x00000040;  //PUAF TRUSTED
            byte obptr = 0;
            int hResult = securityManager.ProcessUrlAction(url, 0x00001A06, out obptr, 1, 0, 0, puaf, 0);
            //hResult = securityManager.ProcessUrlAction(url, 0x00001A10, out obptr, 1, 0, 0, puaf, 0);
            hResult = securityManager.ProcessUrlAction(url, 0x00001A03, out obptr, 1, 0, 0, puaf, 0);
            return;
        }
        finally
        {
            Marshal.ReleaseComObject(securityManager);
        }
    }

    [return: MarshalAs(UnmanagedType.I4)]
    public int SetSecuritySite([In] IntPtr pSite)
    {
        return Convert.ToInt32( 0x800C0011); //INET_E_DEFAULT_ACTION;
    }

    [return: MarshalAs(UnmanagedType.I4)]
    public int GetSecuritySite([Out] IntPtr pSite)
    {
        return Convert.ToInt32(0x800C0011); //INET_E_DEFAULT_ACTION;
    }

    [return: MarshalAs(UnmanagedType.I4)]
    public int MapUrlToZone([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, ref uint pdwZone, uint dwFlags)
    {
        return Convert.ToInt32(0x800C0011); //INET_E_DEFAULT_ACTION;
    }

    [return: MarshalAs(UnmanagedType.I4)]
    public int GetSecurityId([MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, [MarshalAs(UnmanagedType.LPArray)] byte[] pbSecurityId, ref uint pcbSecurityId, uint dwReserved)
    {
        return Convert.ToInt32(0x800C0011); //INET_E_DEFAULT_ACTION;
    }

    [return: MarshalAs(UnmanagedType.I4)]
    public int ProcessUrlAction([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, uint dwAction, out byte pPolicy, uint cbPolicy, byte pContext, uint cbContext, uint dwFlags, uint dwReserved)
    {

                pPolicy = 0;
                return 0;// S_OK;
    }

    [return: MarshalAs(UnmanagedType.I4)]
    public int QueryCustomPolicy([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl, ref Guid guidKey, ref byte ppPolicy, ref uint pcbPolicy, ref byte pContext, uint cbContext, uint dwReserved)
    {
        return Convert.ToInt32(0x800C0011); //INET_E_DEFAULT_ACTION;
    }

    [return: MarshalAs(UnmanagedType.I4)]
    public int SetZoneMapping(uint dwZone, [In, MarshalAs(UnmanagedType.LPWStr)] string lpszPattern, uint dwFlags)
    {
        return Convert.ToInt32(0x800C0011); //INET_E_DEFAULT_ACTION;
    }

    [return: MarshalAs(UnmanagedType.I4)]
    public int GetZoneMappings(uint dwZone, out UCOMIEnumString ppenumString, uint dwFlags)
    {
        ppenumString = null;
        return Convert.ToInt32(0x800C0011); //INET_E_DEFAULT_ACTION;
    }


}

[ComImport, GuidAttribute("79EAC9EE-BAF9-11CE-8C82-00AA004BA90B")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IInternetSecurityManager
{
    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int SetSecuritySite([In] IntPtr pSite);

    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int GetSecuritySite([Out] IntPtr pSite);

    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int MapUrlToZone([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl,
             ref UInt32 pdwZone, UInt32 dwFlags);

    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int GetSecurityId([MarshalAs(UnmanagedType.LPWStr)] string pwszUrl,
              [MarshalAs(UnmanagedType.LPArray)] byte[] pbSecurityId,
              ref UInt32 pcbSecurityId, uint dwReserved);

    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int ProcessUrlAction([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl,
             UInt32 dwAction, out byte pPolicy, UInt32 cbPolicy,
             byte pContext, UInt32 cbContext, UInt32 dwFlags,
             UInt32 dwReserved);

    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int QueryCustomPolicy([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl,
              ref Guid guidKey, ref byte ppPolicy, ref UInt32 pcbPolicy,
              ref byte pContext, UInt32 cbContext, UInt32 dwReserved);

    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int SetZoneMapping(UInt32 dwZone,
               [In, MarshalAs(UnmanagedType.LPWStr)] string lpszPattern,
               UInt32 dwFlags);

    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int GetZoneMappings(UInt32 dwZone, out UCOMIEnumString ppenumString,
            UInt32 dwFlags);


    }
}

我从2006年发现了这篇文章: http://www.tech-archive.net/Archive/InetSDK/microsoft.public.inetsdk.programming.webbrowser_ctl/2006-03/msg00073.html 显然,Cookie不是由安全管理器处理的,它们是由无法自定义的区域管理器处理的.解决此问题的唯一方法是将满足您特定需要的其他区域添加到注册表.不幸的是,当您使用WebBrowser控件时,无法通过代码执行此操作.而且,如果您的网站托管在Web场中,则您无权访问注册表,因此需要另一种方法(可能是IE插件或部署在您有权访问并允许将默认浏览器设置为您所要使用的服务器上)需要)

I found this post from 2006: http://www.tech-archive.net/Archive/InetSDK/microsoft.public.inetsdk.programming.webbrowser_ctl/2006-03/msg00073.html Apparently Cookies are not handled by the Security Manager they are handled by the Zone manager which cannot be customized. The only way to fix this is to add an additional zone for your specific needs to the registry. Unfortunately there is no way to do this from code when you are using the WebBrowser Control. And if your Site is Hosted in a Web Farm you don't have access to the registry so another approach will be needed (possibly a IE Plug In or deploy on a server where you have access and permission to set the default browser to what you need)