我有一个本地网站(不是我的)需要在进行一些查询之前进行身份验证。身份验证标头如下所示:
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控制器发出此请求。
答案 0 :(得分:0)
即使用普通的HTTP身份验证,Cookie来自旧会话。
答案 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=");
希望能帮到别人!