如何在c#中发布帖子前进行身份验证

本文关键字:身份验证 布帖 | 更新日期: 2023-09-27 18:06:45

我有一个本地网站(不是我的),在做一些查询之前需要身份验证。认证头看起来像这样:

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,然后发布数据并从这个网站检索结果。至少这是我认为我需要做的。链接和代码将是超级有用的。如果它是有帮助的,我需要使这个请求从我的网站。

如何在c#中发布帖子前进行身份验证

您使用asp.net membership provider并像Membership.ValidateUser()一样进行身份验证,这也将验证表单的身份验证。检查(Context.User.Identity.IsAuthenticated) ~ FormsAuthentication.SignOut();

是否通过认证

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

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

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

这是使用普通HTTP身份验证,cookie来自旧会话。

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

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

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

希望这对其他人有所帮助!