Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式登录mediawiki网站_C#_Php_Login_Mediawiki - Fatal编程技术网

C# 如何以编程方式登录mediawiki网站

C# 如何以编程方式登录mediawiki网站,c#,php,login,mediawiki,C#,Php,Login,Mediawiki,您好,有一个使用MW 1.18.2构建的网站,它要求用户登录-没有它,您无法访问其中的任何页面。我拥有从浏览器手动登录的有效凭据,但我需要能够从windows窗体应用程序(C#)中执行同样的操作:当用户单击按钮时,我必须显示(或导航到)网站的特定页面,为此,我必须先以编程方式登录。我在PHP和JScript中找到了这些示例,但作为该网站的新手,我不知道如何使用它们,也不确定它们是否可以在客户端使用 任何帮助都将不胜感激。网站身份验证的工作原理如下: 用户(通过HTTP POST操作)向服务器提交

您好,有一个使用MW 1.18.2构建的网站,它要求用户登录-没有它,您无法访问其中的任何页面。我拥有从浏览器手动登录的有效凭据,但我需要能够从windows窗体应用程序(C#)中执行同样的操作:当用户单击按钮时,我必须显示(或导航到)网站的特定页面,为此,我必须先以编程方式登录。我在PHP和JScript中找到了这些示例,但作为该网站的新手,我不知道如何使用它们,也不确定它们是否可以在客户端使用


任何帮助都将不胜感激。

网站身份验证的工作原理如下:

  • 用户(通过HTTP POST操作)向服务器提交凭据
  • 如果凭据正确,服务器将使用会话令牌和其他cookie令牌进行响应。浏览器存储这些内容,并在每次请求时将其返回给服务器
  • 也许最简单的选择是在WebBrowser控件中以编程方式填写表单并提交。实现这一点所需的步骤如下。主要步骤是确定要操作的表单元素(用户名和密码字段),所有这些都可以使用大多数web浏览器中可用的各种开发人员工具来完成

    另一种选择是使用HttpClient提交登录详细信息,然后将收到的会话和cookie数据传递给WebBrowser控件。查看维基百科,登录字段似乎是通过POST提交的:

    URL: https://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login&returnto=Main+Page
    wpName: <username>
    wpPassword: <password>
    wpRemember: 1|0
    wpLoginAttempt: Log in
    wpLoginToken: <a token from a hidden form input>
    wpForceHttps: 0
    
    URL:https://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login&returnto=Main+页面
    wpName:
    密码:
    记住:1 | 0
    wploginattent:登录
    wpLoginToken:
    wpfforcehttps:0
    
    我通过在网络标签下使用谷歌Chrome的开发者工具(按F12键)发现了这一点。如果提交表单,通常可以找到包含表单信息的POST请求(与大多数HTTP GET请求相反)


    这里最大的问题可能是表单中隐藏的令牌。我可以想象,除了登录表单之外,任何地方都可以停止自动登录。如果mediawiki在默认情况下使用此选项,那么如果您不控制mediawiki的安装,就无法轻松绕过它。此时,您最好只使用第一种方法(因为您必须访问DOM才能获得令牌)。

    谢谢您,或者,它可以:

    private void buttonLoginAndShowMainPage_Click(object sender, EventArgs e)
        {
            this.webBrowser1.Navigate(mediawikisite);
        }
    
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            HtmlDocument doc = this.webBrowser1.Document;
    
            HtmlElement LoginForm = doc.Forms[0];
            HtmlElement UserName = doc.GetElementById("wpName1");
            HtmlElement Password = doc.GetElementById("wpPassword1");
    
            UserName.SetAttribute("value", "myuserid");
            Password.SetAttribute("value", "mypassword");
    
            LoginForm.InvokeMember("submit");
        }
    

    您是使用web浏览器控件还是纯代码来显示页面?这没关系,我都可以