如何在C#中的帖子之前进行身份验证?

时间:2013-03-29 18:29:12

标签: c# cookies httpwebrequest

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

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 app控制器发出此请求。

4 个答案:

答案 0 :(得分:0)

即使用普通的HTTP身份验证,Cookie来自旧会话。

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

答案 1 :(得分:0)

您使用asp.net membership provider并执行Membership.ValidateUser()之类的身份验证,这也将验证formsauthentication。如果(Context.User.Identity.IsAuthenticated) - FormsAuthentication.SignOut();

,请检查是否已通过身份验证

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

我的最终代码(在我的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=");

希望能帮到别人!