【问题标题】:WebClient accessing page with credentialsWebClient 使用凭据访问页面
【发布时间】:2012-06-22 12:57:19
【问题描述】:

我正在尝试访问同一域/同一 asp.net 应用程序上的网页,该网页受密码保护。用于触发此调用的网页和正在访问的网页的凭据相同。

这是代码,不知道为什么我总是以登录表单的html代码结束?

using (WebClient client = new WebClient())
{
    client.QueryString.Add("ID", "1040"); //add parameters
    //client.Credentials = CredentialCache.DefaultCredentials;
    //I tried to add credentials like this
    client.Credentials = new NetworkCredential("username", "password");

    string htmlCode = client.DownloadString("http://domain.loc/testpage.aspx");
}

【问题讨论】:

  • 你为什么不直接重定向到那个页面?在服务器进程中使用代码下载它意味着您没有使用相同的凭据。如果我理解正确,而不是浏览器(使用客户端凭据)访问页面,不同机器(服务器)上的不同进程正在下载它并将其呈现给客户端!
  • 这些凭据是如何提供给网页的?它是否使用表单身份验证?
  • @shambulator 重定向到该页面是什么意思?我正在尝试获取该页面的 html 代码。
  • @DarinDimitrov 是的,它使用表单身份验证。

标签: c# asp.net webclient credentials defaultnetworkcredentials


【解决方案1】:

我怀疑您尝试访问的网页使用了表单身份验证。这意味着如果您希望能够访问受保护的资源,则必须提供有效的身份验证 cookie。为了获得有效的身份验证 cookie,您必须首先通过向发出 cookie 的登录页面发送 POST 请求来验证自己。检索 cookie 后,您将能够在对受保护资源的后续请求中将其发送。您还应该注意,开箱即用的 WebClient 不支持 cookie。出于这个原因,您可以编写一个自定义 cookie 感知网络客户端:

public class CookieAwareWebClient : WebClient
{
    public CookieAwareWebClient()
    {
        CookieContainer = new CookieContainer();
    }
    public CookieContainer CookieContainer { get; private set; }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = (HttpWebRequest)base.GetWebRequest(address);
        request.CookieContainer = CookieContainer;
        return request;
    }
}

现在您可以使用此客户端触发 2 个请求:

using (var client = new CookieAwareWebClient())
{
    var values = new NameValueCollection
    {
        { "username", "john" },
        { "password", "secret" },
    };
    client.UploadValues("http://domain.loc/logon.aspx", values);

    // If the previous call succeeded we now have a valid authentication cookie
    // so we could download the protected page
    string result = client.DownloadString("http://domain.loc/testpage.aspx");
}

显然,由于 ASP.NET 的 ViewState 很糟糕,您可能需要在登录请求中发送几个其他参数。您可以执行以下操作:在 Web 浏览器中进行身份验证,并使用 FireBug 查看需要发送的确切参数和标头。

【讨论】:

  • 解决方案看起来很干净。登录集合的名称真的应该是用户名和密码吗?尽管是基于表单的身份验证,但应用程序是否有不同的方式使用当前凭据?
  • @John,我不知道登录名是否应该是用户名和密码。这完全取决于您的登录页面是如何实现的以及它期望的参数。而且,不,没有其他办法。您需要获取有效的表单身份验证 cookie,而获取此类 cookie 的唯一方法是向您的登录页面提供正确的凭据。只有这个页面(希望 :-))发出表单身份验证 cookie。
  • 代码不工作,但我理解这个想法,我会努力让它工作。
  • 无法让它工作。我现在认为 WebClient 不是要走的路..
  • 我找到了一个结合登录数据、提交按钮和视图状态的解决方案。您可能想查看此链接 odetocode.com/Articles/162.aspx 并与我们分享您的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多