C# ASP.NET使用身份验证标头将JSON数据发布到HTTP API

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/");

我有C#代码将JSON数据发送到服务器,但我一直收到401(未经授权)响应。下面的代码应该根据正确地发出POST请求,对吗?我也尝试过一些小的变化,但效果相同

这是发出请求的代码:

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响应似乎是一个挑战,您必须使用包含的给定参数进行回答。