你能在C#中通过Webclient提供凭据吗?

时间:2013-06-18 13:57:23

标签: c# cas

我需要访问一个位于中央身份验证服务器后面的php页面。使用任何其他方法,当我尝试访问此站点时,它会重定向到CAS页面,等待身份验证。基本上,我向验证页面提供了GET个变量。 (不要。)遗憾的是,我们无法删除此页面的CAS,因为它存在巨大的安全风险。

所以我的问题是,无论如何都要向CAS提供我的凭据,存储任何cookie,然后使用它,访问php页面?

我的尝试如下:

由于我使用GET方法,我不需要担心等到我在php页面提供值,我只需要实际访问页面,我们' ll致电https://site.com/page.php?var1=value1&var2=value2

正如WebClient accessing page with credentials建议的那样,我创建了一个班级CookieAwareClient

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;
    }
}

然后提交以下内容:

使用(var client = new CookieAwareWebClient())

using (var client = new CookieAwareWebClient())
{
    var values = new NameValueCollection
    {
        {"username", "usr" },
        {"password", "(passw0rd!)"}, //don't worry. not actual information
    };

    //This should bring me to the login page, which will upload the values I have given
    client.UploadValues("https://site.com/page.php?var1=value1&var2=value2", values);

    string result = client.DownloadString("https://site.com/page.php?var1=value1&var2=value2");

遗憾的是,这仍然没有将我登录到CAS中,结果将作为CAS的HTML返回。

有没有人知道我是如何解决这个问题的?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我不知道CAS是否支持开箱即用的标准HTTP身份验证。它通常是基于表格的。

重定向到CAS后,您需要解析/抓取页面中的一些隐藏表单变量。 POST这些参数,用户名和密码(以及通过GET请求返回的cookie)。

CAS应该返回HTTP重定向。 (将在集合中添加一个额外的cookie:CASTGC cookie。)webclient应该将您重定向回最初请求的资源。有些应用可能需要两次才能回来。

如果要在Web应用程序会话的生命周期内轮询资源,请使用相同的CookieCollection进行后续调用,并且不应再次对CAS进行身份验证。