1

我有一个本地网站(不是我的),在进行一些查询之前需要进行身份验证。身份验证标头如下所示:

Host: 192.168.7.9
Connection: keep-alive    
Content-Length: 185
Origin: http://192.168.7.9
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/27.0.1453.3 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*
DNT: 1
Referer: http://192.168.7.9/signin
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: _FProEnterprise_session=BAh7CzoVbmVlZF93ZWxjb21lX21zZ1Q6D3Nlc3Npb25faWQiJTUxNjI5OGRiMDNmNjU4ZDg4ODE3NmFiZjhmMDU3YTI2OglzaXRlSSIKc2l0ZTAGOgZFRjoObGFuZ19wYXRoSSIHZW4GOwhUOg5vbmVfY2xpY2tGOgx1c2VyX2lkaRE%3D--0c6634a714baa7f0e4795aee89b31f9b7ec0565e

请求正文如下所示:

username=myusername&password=mypassword

我对身份验证的工作方式不是很了解。那么首先,这是表单身份验证吗?我猜是这样,因为我必须在网站上输入我的用户名和密码,然后提交才能进入。

其次,为什么已经有 Cookie 了?可能是以前的会话,我可以忽略它吗?

我的目标是在 C# 中重现这一点,以便我可以进行身份​​验证、获取 cookie,然后发布数据并从该站点检索结果。至少那是我认为我需要做的。链接和代码将非常有帮助。如果有帮助,我需要从我的 web.api 应用控制器发出这个请求。

4

4 回答 4

0

那是使用纯 HTTP 身份验证,cookie 来自旧会话。

http://en.wikipedia.org/wiki/Basic_access_authentication

于 2013-03-29T18:33:37.273 回答
0

您使用asp.net membership provider并进行身份验证Membership.ValidateUser(),这也将验证表单身份验证。检查它是否经过身份验证(Context.User.Identity.IsAuthenticated)-FormsAuthentication.SignOut();

您首先需要 sql server 或某种身份验证机制来保存用户名和密码。

于 2013-03-29T18:35:24.347 回答
0

这似乎是一个 AJAX 请求(X-Requested-With: XMLHttpRequest)。因此,用户必须首先在网页上,也就是会话开始的时间。那是用户获取会话cookie的时间,每次发送该cookie以跟踪会话。该会话也保存在存储登录信息的服务器上——无论您是否登录,以及您是谁。

内容似乎是一个简单的 HTTP 表单,但由于它来自 XMLHttpRequest,它也可以使用 Javascript 创建。这至少是通过 HTTP 发送 POST 数据的标准方式。

于 2013-03-29T18:39:38.293 回答
0

这个链接为我解决了这个问题: 这里

我的最终代码(在我的 web.api 控制器中看起来像这样):

    public static string JsonWithAuth( string url, string data )
    {
        var bytes = Encoding.Default.GetBytes( data );

        using ( var client = new WebClientEx() )
        {
            var values = new NameValueCollection
            {
                { "username", "myUsername" },
                { "password", "myPassword" },
            };
            // Authenticate
            client.UploadValues( "http://192.168.7.9/main/signin", values );

            // Post data
            var response = client.UploadData( url, "POST", bytes );

            return Encoding.Default.GetString( response );
        }
    }

这是使它起作用的类(来自链接的答案):

/// <summary>
/// A custom WebClient featuring a cookie container
/// </summary>
public class WebClientEx : WebClient
{
    public CookieContainer CookieContainer { get; private set; }

    public WebClientEx()
    {
        CookieContainer = new CookieContainer();
    }

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

所以我最后的电话是这样的:

string sampleInfo = JsonWithAuth(
    "http://192.168.7.9/samples/sample_locations_list",
    "sort=position&dir=ASC&box_id=");

希望对其他人有所帮助!

于 2013-03-29T22:45:08.840 回答