Asp.net web服务器中的WebBrowser控件未从网站返回Cookie
我试图从Web应用程序中的WebBrowser控件访问HTTPS站点,以从该站点获取一些基本信息(该站点目前没有Web服务或任何其他API) 当我从IIS Express执行此操作时,我能够连接登录并导航到其他页面,就像我从该系统上的web浏览器直接连接时一样,一切正常 从大多数开发系统,即Windows 10或Windows Server 2016,我可以发布web应用程序,连接到web应用程序,然后通过web应用程序连接到站点,登录并加载其他页面,一切正常。 但是…。 当我部署到GoDaddy并通过应用程序连接到站点时,我能够成功登录,但当我导航到另一个页面时,我会重定向到登录页面 我注意到,在GoDaddy上浏览应用程序时,我没有得到任何JSESSION Cookies,但在所有其他成功案例中,我都得到了它们。 我在登录目标站点之前收到了JSESSON Cookies:但是任何在connect上返回Cookies的网站都应该足够了。 我已将用户代理更改为桌面上的相同代理,并已连接,但在GoDaddy上仍能获得相同的结果 我曾在受SSL保护(HTTPS)和不受SSL保护(HTTP)的GoDaddy站点上尝试过这种方法。 希望有人在使用WebBrowser控件之前遇到过此类问题 下面是代码的一个测试片段(您可能会注意到,我尝试了很多方法来解决CookiePresistance、清除Cookie、清除JScript状态等问题:Asp.net web服务器中的WebBrowser控件未从网站返回Cookie,asp.net,webbrowser-control,session-cookies,defaultnetworkcredentials,Asp.net,Webbrowser Control,Session Cookies,Defaultnetworkcredentials,我试图从Web应用程序中的WebBrowser控件访问HTTPS站点,以从该站点获取一些基本信息(该站点目前没有Web服务或任何其他API) 当我从IIS Express执行此操作时,我能够连接登录并导航到其他页面,就像我从该系统上的web浏览器直接连接时一样,一切正常 从大多数开发系统,即Windows 10或Windows Server 2016,我可以发布web应用程序,连接到web应用程序,然后通过web应用程序连接到站点,登录并加载其他页面,一切正常。 但是…。 当我部署到GoDadd
public static class NativeMethods
{
[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption,
IntPtr lpBuffer, int lpdwBufferLength);
public static void SuppressCookiePersist()
{
int dwOption = 81; //INTERNET_OPTION_SUPPRESS_BEHAVIOR
int option = 3; // INTERNET_SUPPRESS_COOKIE_PERSIST
IntPtr optionPtr = Marshal.AllocHGlobal(sizeof(int));
Marshal.WriteInt32(optionPtr, option);
bool x = InternetSetOption(IntPtr.Zero, dwOption, optionPtr, sizeof(int));
Marshal.FreeHGlobal(optionPtr);
}
public static void EnableCookiePersist()
{
int dwOption = 81; //INTERNET_OPTION_SUPPRESS_BEHAVIOR
int option = 4; // INTERNET_SUPPRESS_COOKIE_POLICY ignores policy and allows cookies to be set https://msdn.microsoft.com/en-us/library/windows/desktop/aa385328(v=vs.85).aspx
IntPtr optionPtr = Marshal.AllocHGlobal(sizeof(int));
Marshal.WriteInt32(optionPtr, option);
InternetSetOption(IntPtr.Zero, dwOption, optionPtr, sizeof(int));
option = 1;
Marshal.WriteInt32(optionPtr, option);
InternetSetOption(IntPtr.Zero, dwOption, optionPtr, sizeof(int));
Marshal.FreeHGlobal(optionPtr);
}
public static void ClearBrowserSession()
{
int dwOption = 42; //INTERNET_OPTION_END_BROWSER_SESSION
InternetSetOption(IntPtr.Zero, dwOption, IntPtr.Zero, 0);
}
}
public partial class TestStub: System.Web.UI.Page
{
protected void btnNavigate_Click(object sender, EventArgs e)
{
NativeMethods.EnableCookiePersist();
if(tbUrl.Text == "")
{
Client_Alert("Please enter url");
return;
}
if (tbUserAgent.Text == "")
tbUserAgent.Text = CurrentUserAgent;
object o = tbUrl.Text;
var t = new Thread((ParameterizedThreadStart)GetPage);
t.SetApartmentState(ApartmentState.STA);
t.Start(o);
GettingPage = true;
while (GettingPage == true)
Thread.Sleep(500);
t.Join();
return;
}
private void GetPage(object o)
{
StringBuilder SB = new StringBuilder();
DirectorBrowser = new WebBrowser();
NativeMethods.ClearBrowserSession();
DirectorBrowser.ScrollBarsEnabled = false;
DirectorBrowser.ScriptErrorsSuppressed = true;
DirectorBrowser.AllowNavigation = true;
DirectorBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; '); for (e = 0; e < a.length && a[e]; e++) { f++; for (b = '.' + location.host; b; b = b.replace(/^ (?:% 5C.|[^% 5C.] +) /, '')){ for (c = location.pathname; c; c = c.replace(/.$/, '')) { document.cookie = (a[e] + '; domain=' + b + '; path=' + c + '; expires=' + new Date((new Date()).getTime() - 1e11).toGMTString()); } }}})())");
NativeMethods.EnableCookiePersist();
DirectorBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_NoticeCompleted);
Uri url = new Uri((string)o);
DirectorBrowser.Navigate(url, null, null, "User-Agent: " + tbUserAgent.Text);
GettingPage = true;
while (GettingPage == true)
{
System.Windows.Forms.Application.DoEvents();
Thread.Sleep(500);
}
}
private void browser_NoticeCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (GettingPage == true)
{
HtmlElement body = DirectorBrowser.Document.Body;
HtmlElementCollection inputs = DirectorBrowser.Document.GetElementsByTagName("INPUT");
HtmlElementCollection forms = DirectorBrowser.Document.Forms;
body = DirectorBrowser.Document.Body;
string webResults = body.InnerHtml;
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(webResults);
htmlDoc.OptionFixNestedTags = true;
tbMaintenanceResults.Text = "Cookies: <br>" + DirectorBrowser.Document.Cookie + "<br>" + body.InnerHtml;
GettingPage = false;
}
else
{
GettingPage = false;
}
}
}
公共静态类NativeMethods
{
[DllImport(“wininet.dll”,SetLastError=true)]
私有静态外部bool InternetSetOption(IntPtr hInternet、intdwoption、,
IntPtr lpBuffer,int lpdwBufferLength);
公共静态void SuppressCookiePersist()
{
int dwOption=81;//互联网选项抑制行为
int option=3;//INTERNET\u禁止\u COOKIE\u持久化
IntPtr optionPtr=Marshal.AllocHGlobal(sizeof(int));
封送员写入32(选项PTR,选项);
boolx=InternetSetOption(IntPtr.Zero、dwOption、optionPtr、sizeof(int));
自由环球元帅(选择权PTR);
}
公共静态void enableCookiePersistence()
{
int dwOption=81;//互联网选项抑制行为
int option=4;//INTERNET\u SUPPRESS\u COOKIE\u策略忽略策略并允许设置COOKIEhttps://msdn.microsoft.com/en-us/library/windows/desktop/aa385328(v=vs.85).aspx
IntPtr optionPtr=Marshal.AllocHGlobal(sizeof(int));
封送员写入32(选项PTR,选项);
InternetSetOption(IntPtr.Zero、dwOption、optionPtr、sizeof(int));
选项=1;
封送员写入32(选项PTR,选项);
InternetSetOption(IntPtr.Zero、dwOption、optionPtr、sizeof(int));
自由环球元帅(选择权PTR);
}
公共静态无效ClearBrowserSession()
{
int dwOption=42;//INTERNET\u选项\u结束\u浏览器\u会话
InternetSetOption(IntPtr.Zero,dwOption,IntPtr.Zero,0);
}
}
公共部分类TestStub:System.Web.UI.Page
{
受保护的void btnNavigate\u单击(对象发送方,事件参数e)
{
NativeMethods.EnableCookiePersist();
如果(tbUrl.Text==“”)
{
客户端警报(“请输入url”);
返回;
}
如果(tbUserAgent.Text==“”)
tbUserAgent.Text=CurrentUserAgent;
objecto=tbUrl.Text;
var t=新线程((ParameterizedThreadStart)GetPage);
t、 SetApartmentState(ApartmentState.STA);
t、 启动(o);
GettingPage=true;
while(GettingPage==true)
睡眠(500);
t、 Join();
返回;
}
私有void GetPage(对象o)
{
StringBuilder SB=新的StringBuilder();
DirectorBrowser=新的WebBrowser();
NativeMethods.ClearBrowserSession();
DirectorBrowser.ScrollBarsEnabled=false;
DirectorBrowser.ScriptErrorsSuppressed=true;
DirectorBrowser.AllowNavigation=true;
DirectorBrowser.Navigate(“javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split(';');for(e=0;e”+DirectorBrowser.Document.Cookie+“
”+body.InnerHtml;
GettingPage=false;
}
其他的
{
获取页面=
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);
}
}