【问题标题】:How to login to my router using c# application如何使用 C# 应用程序登录到我的路由器
【发布时间】:2023-10-16 09:29:01
【问题描述】:

我正在尝试获取路由器上已连接设备的列表。我可以手动完成,但我想要一个 c# 应用程序为我完成,以便我可以自动监控我的网络。

我已经尝试过使用以下代码向包含设备的路由器页面的 URL 发出 WebRequest:

string url = @"http://192.168.1.1/ui/dboard/homenet";
WebRequest request = WebRequest.Create(url);
request.Method = "GET";
request.ContentType= "application/x-www-form-urlencoded";
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("admin:admin"));

Stream stream = request.GetResponse().GetResponseStream();
StreamReader reader1 = new StreamReader(stream);
string response = reader1.ReadToEnd();

foreach (string el in response.Split('\n'))
{
    Console.WriteLine(el);
}

但我得到的响应是重定向到路由器的登录页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <meta http-equiv="Cache-Control" content="no-cache" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="-1" />
    <link rel="SHORTCUT ICON" href="/images/shortcut.ico" />

    <meta name="viewport" content="width=device-width, initial-scale=1" />

    <title>Residential Gateway - D-Link</title>

    <link rel="stylesheet" href="/css/common.css" />
    <link rel="stylesheet" href="/css/theme.css" />

    <script type="text/javascript" src="/js/jquery.tools.min.js"></script>
    <script type="text/javascript" src="/js/common.js"></script>
    <script type="text/javascript" src="/js/headerMobile.js"></script>
    <script type="text/javascript">detectMobile();</script>

    <link rel='stylesheet' type='text/css' href='/css/login.css'/>
    <link rel='stylesheet' href='/css/custom.css'/>
    <script type='text/javascript'>detectMobile('login_m.css');</script>
    <script type='text/javascript'>detectMobile('custom_m.css');</script>
    <script type='text/javascript' src='/js/hmac-sha256.js'></script>
    <script type='text/javascript' src='/js/md5.js'></script>
    <script type='text/javascript' src='/js/md5_crypt.js'></script>
</head>
<body onresize="resize()" onscroll="resize()" onmouseup="resize()">
<div id="header">

<div id='btnClose'><button type='button' class='close' onclick='link_onclick(this); history.back()'/></div>

<img id="logo" src="/images/logo.png" />
</div>

<!--START content-->
<div id="content">

<form name="form" action="/ui/login" method="post" onsubmit="login_onsubmit();" autocomplete="off">
<div id="loginPanelBox">
<div id="navigationBarMobile">
        <ul>
<li>Login</li>
        </ul>
</div>


<div id="panelLogin" class="panel">
<label class="panel">
Login
</label>
<img class="panel" src="/images/Login16.png" />
<hr class="panel" />

<fieldset class="form">


<div class="formField" id="userName" help_tooltip="off">
        <label for="userName">Nome Utente:</label>
        <input type="text" name="userName" value="" />

</div>

<div class="formField" id="origUserPwd">
        <label for="origUserPwd">Password:</label>
        <div class="passwordField">

<input type="password" autocomplete="off" name="origUserPwd" value="" />

        </div>
</div>

我通过 POST 请求得到相同的结果,将用户名和密码设置为这样的凭据:

request.Credentials = new NetworkCredential("admin", "admin");

但仍然没有有用的结果。 我确定用户名和密码正确。

我怎样才能成功登录并获得我想要的页面? 路由器标签是 D-Link。

【问题讨论】:

  • 使用您的浏览器调试器,检查网络选项卡查看发布请求,模仿它。例如,我的 Linksys 使用 json 请求和基本身份验证,当我登录时,我可以看到 post 请求以及标题和响应,我可以在我的请求中使用它来使用相同的请求信息从 HttpWebRequest 登录/跨度>

标签: c# html network-programming webrequest


【解决方案1】:

感谢 iSR5 提出使用浏览器调试器的建议,帮助很大。

我的问题的核心是对路由器如何管理 Web 请求的理解不完整。 从网页(作为登录页面)提示的 Web 请求由运行在路由器上的 cgi 服务处理。尤其是直接通过 http 请求调用服务。

例如,在登录路由器时,单击“登录按钮”会触发对 cgi 服务的调用,在我的情况下(我不知道每个路由器标签是否都这样)用户名和密码被传递作为 url 参数。浏览器调试器显示准确的 url。

为了避免管理网页,c# 应用程序必须直接向 cgi 服务发出请求。

除此之外,还需要管理 cookie: 成功登录(连接到 cgi)后,响应头包含会话 cookie,对于 c# 应用程序发出的每个进一步请求,都需要在请求头中添加这些 cookie。

【讨论】:

    最近更新 更多