【问题标题】:C# .. API httpclient authentication and proxy with username and passwordC# .. API httpclient 身份验证和代理与用户名和密码
【发布时间】:2017-09-18 19:50:38
【问题描述】:

我是 API 领域的新手,但我有一个问题, 我想从 Web API 获取数据,但是有两个身份验证

  • 首先使用代理。
  • 其次是基于 API 的身份验证。

这是我的获取操作代码:

        HttpClientHandler handler = new HttpClientHandler();
        handler.Credentials = new NetworkCredential("test", "testing");
        HttpClient client = new HttpClient(handler);
        client.BaseAddress = new Uri("http://test.abctesting.com/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.
            MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = client.GetAsync("admin/apiv2/").Result;
        var tenders = response.Content.ReadAsAsync<tenders>().Result;

这段代码对我来说很好,但只是传递了代理用户名和密码! 如何继续使用身份验证用户名和密码获取 API 数据?

【问题讨论】:

  • 你知道你的API使用的是哪种认证方式吗?
  • 我认为的基本身份验证

标签: c# api


【解决方案1】:

由于您在 cmets 上提到 “基本身份验证”,因此除了您可能有帮助的内容之外,添加以下几行

 var byteArray = Encoding.ASCII.GetBytes($"{yourUsername}:{yourPassword}");
 client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

虽然还有OAuthBearer等其他比较流行的认证方式,但是根据认证方式修改AuthenticationHeaderValue上的key并适当设置值

【讨论】:

    【解决方案2】:

    这应该可行:

    HttpClientHandler handler = new HttpClientHandler();
    handler.Credentials = new NetworkCredential("test", "testing");
    HttpClient client = new HttpClient(handler);
    client.BaseAddress = new Uri("http://test.abctesting.com/");
    client.DefaultRequestHeaders.Accept.Clear();
    
    client.DefaultRequestHeaders.Accept.Add(
        new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    
    string user = "user", password = "password";
    
    string userAndPasswordToken =
        Convert.ToBase64String(Encoding.UTF8.GetBytes(user + ":" + password));
    
    client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", 
        $"Basic {userAndPasswordToken}");
    
    HttpResponseMessage response = client.GetAsync("admin/apiv2/").Result;
    var tenders = response.Content.ReadAsAsync<tenders>().Result;
    

    【讨论】:

    • 它有 3 个错误 .. .. 意外字符 $ .. 无效表达式术语 '' .. ) 预期
    猜你喜欢
    • 2018-07-13
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多