0

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

任何帮助将不胜感激。

4

2 回答 2

1

谢谢LeoR,它有效:

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");
    }
于 2013-10-24T18:35:05.970 回答
1

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

  1. 用户(通过 HTTP POST 操作)向服务器提交凭据
  2. 如果凭据正确,服务器将使用会话令牌和可能的其他 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

我通过使用 Google Chrome 的开发者工具(按 F12)在 Network 标签下发现了这一点。如果您提交表单,您通常可以找到包含表单信息的 POST 请求(与大多数 HTTP GET 请求相反)。

您在这里遇到的最大问题可能是表单中的隐藏标记。我想它的存在是为了阻止从登录表单以外的任何地方自动登录。如果 mediawiki 默认使用它,如果您不控制 mediawiki 安装,则没有简单的方法可以绕过它。此时,您不妨只使用第一种方法(因为您必须访问 DOM 才能获取令牌)。

于 2013-10-22T15:17:50.183 回答