0

ユーザー関連情報を取得するためにc#webclientを使用してフォーラムにログインしようとしています。問題は、ログインに失敗することです。必要なすべてのデータを投稿で送信しようとしました。

私の実際のコード:

        var url = new Uri("http://www.hardwareluxx.de/community/");
        string user = Properties.Resources.username;
        string pass = Properties.Resources.password;
        var client = new CookieAwareWebClient();
        client.BaseAddress = @"http://www.hardwareluxx.de/community/";


        var document = new HtmlDocument();
        document.Load(new MemoryStream(client.DownloadData("index.php")));

        postData = new NameValueCollection();

        postData.Add("vb_login_username", user);
        postData.Add("cookieuser", "1");
        postData.Add("vb_login_password", "");
        postData.Add("s", "");
        postData.Add("securitytoken", "guest");
        postData.Add("do", "login");
        postData.Add("vb_login_md5password", GetMd5Hash(pass));
        postData.Add("vb_login_md5password_utf", GetMd5Hash(pass));

        document.Load(new MemoryStream(client.UploadValues(url + "login.php?do=login", postData)));

ログインに必要なmd5ハッシュを取得するための小さな支援メソッド:

public static string GetMd5Hash(string TextToHash)
    {
        //Prüfen ob Daten übergeben wurden.
        if (string.IsNullOrEmpty(TextToHash))
        {
            return string.Empty;
        }

        //MD5 Hash aus dem String berechnen. Dazu muss der string in ein Byte[]
        //zerlegt werden. Danach muss das Resultat wieder zurück in ein string.
        MD5 md5 = new MD5CryptoServiceProvider();
        byte[] textToHash = Encoding.Default.GetBytes(TextToHash);
        byte[] result = md5.ComputeHash(textToHash);

        return BitConverter.ToString(result);
    }

また、Cookieが保存されているWebクライアント:

public class CookieAwareWebClient : WebClient
{
    private readonly CookieContainer _cookie = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = _cookie;
        }
        return request;
    }
}
4

1 に答える 1

0

request.Credentials を使用して、資格情報を HttpWebRequest インスタンスに渡す必要があります。

public class CookieAwareWebClient : WebClient
{
  private readonly CookieContainer _cookie = new CookieContainer();
  private string userName;
  private string password;

  public CookieAwareWebClient(string user, string pass) 
  {
    userName = user;
    password = pass; 
  }

  protected override WebRequest GetWebRequest(Uri address)
  {
    WebRequest request = base.GetWebRequest(address);

    if (!string.IsNullOrEmpty(userName)) 
    {
      request.Credentials = new NetworkCredential(userName, password);
    }

    if (request is HttpWebRequest)
    {
      (request as HttpWebRequest).CookieContainer = _cookie;
    }

    return request;
  }
}
string user = Properties.Resources.username;
string pass = Properties.Resources.password;

var client = new CookieAwareWebClient(user, pass);
于 2012-07-06T09:37:31.937 に答える