C# ASP.NET使用身份验证标头将JSON数据发布到HTTP API
我有C#代码将JSON数据发送到服务器,但我一直收到401(未经授权)响应。下面的代码应该根据正确地发出POST请求,对吗?我也尝试过一些小的变化,但效果相同 这是发出请求的代码:C# ASP.NET使用身份验证标头将JSON数据发布到HTTP API,c#,json,authentication,asp.net-web-api,http-headers,C#,Json,Authentication,Asp.net Web Api,Http Headers,我有C#代码将JSON数据发送到服务器,但我一直收到401(未经授权)响应。下面的代码应该根据正确地发出POST请求,对吗?我也尝试过一些小的变化,但效果相同 这是发出请求的代码: public async Task Create() { using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://zrh.cloudsigma.com/api/2.0/");
public async Task Create()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://zrh.cloudsigma.com/api/2.0/");
var testVM = new CS_VM("test");
var auth = string.Format("{0}:{1}", "mail@mail.com", "password");
var encoded = Convert.ToBase64String(Encoding.ASCII.GetBytes(auth));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", encoded);
HttpResponseMessage response = await client.PostAsJsonAsync("servers", testVM);
if (response.IsSuccessStatusCode)
{
var a = "ok";
}
else
{
var a = "fail";
}
}
}
这是作为JSON发送的类:
public class CS_VM
{
public CS_VM(string type)
{
if ("test" == type)
{
cpu = 1000;
mem = 536870912;
name = "testServer";
vcn_password = "testserver";
}
}
public string name { get; set; }
public int cpu { get; set; }
public int cores { get; set; }
public int mem { get; set; }
public string status { get; set; }
public Owner owner { get; set; }
public Uri resource_uri { get; set; }
public string uuid { get; set; }
public string vcn_password { get; set; }
}
请求标头:
Authorization: Basic bWFpbEBtYWlsLmNvbTpwYXNzd29yZA==
和响应标题:
传输编码:分块
连接:保持活力
变化:饼干
X-REQUEST-ID:2584e232-5bb2-48c0-a307-67e6c03258c0
日期:2015年7月19日星期日格林尼治标准时间21:39:21
服务器:cloudflare nginx
WWW-Authenticate:Digest nonce=“1437341961.55:6967:0fd0a6b2dcde8f45a5ae288c3b73ee12”,realm=“users”,algorithm=“MD5”,opaque=“b228739d1711b0ff025703aea82ee2a208faaa7”,qop=“auth”,stale=“false”,Basic realm=“users”
CF-RAY:2089941a6935168e ARN
来自WWW.Authenticate:Digest nonce=“1437341…
看起来是这样,这是一个摘要身份验证。您应该根据得到的响应构建一个新的授权头。使用有关链接的方法,并使用摘要访问身份验证
部分。nonce
,realm
,qop
变量在第一个401响应中给出。401通常意味着身份验证-我猜您的用户名/密码被拒绝了。尝试共享整个响应头,看看是否有更具体的细节。您能检查传出请求以确保正确发送头吗?@Whymarrh我将它们添加到问题中。这就是我在发送客户机对象之前调试该对象时所能得到的结果。您是否使用only get方法尝试了您的代码。通常做get比post简单。我认为身份验证被认为是摘要(不知道为什么)。在响应中,您将得到401,其中包含一些基本信息,使您能够构建新的身份验证头。使用您得到的响应nonce=“1437341961.55:6967:0fd0a6b2dcde8f45a5ae288c3b73ee12”
和领域
和qop
。401响应似乎是一个挑战,您必须使用包含的给定参数进行回答。