【问题标题】:Calling WEB API with basic authentication in C#在 C# 中使用基本身份验证调用 WEB API
【发布时间】:2019-08-26 21:44:27
【问题描述】:

我有一个我编写的工作 WEB API,我向 API 添加了基本身份验证(用户名是“testing”,密码是“123456”)。但是,当尝试从我的 Web 表单调用该 API 时,我不断收到“(401) Unauthorized”消息。我应该在 Web 代码中更改哪些内容才能成功调用 API?

 string url = String.Format("http://example.com"); //here I have the correct url for my API
 HttpWebRequest requestObj = (HttpWebRequest)WebRequest.Create(url);
 requestObj.Method = "Get";
 requestObj.PreAuthenticate = true;
 requestObj.Credentials = new NetworkCredential("testing", "123456");
 HttpWebResponse responseObj = null;
 responseObj = (HttpWebResponse)requestObj.GetResponse();
 string strresult = null;
 using (Stream stream = responseObj.GetResponseStream())
 {
     StreamReader sr = new StreamReader(stream);
     strresult = sr.ReadToEnd();
     sr.Close();
 }

这是我的 API 在身份验证方面搜索的内容:

actionContext.Request.Headers.Authorization.Parameter

我应该添加标头而不是 NetworkCredential 还是一样?

【问题讨论】:

    标签: c# asp.net asp.net-web-api basic-authentication credentials


    【解决方案1】:

    这应该会有所帮助:

        HttpMessageHandler handler = new HttpClientHandler()
        {
        };
            
        var httpClient = new HttpClient(handler)
        {
             BaseAddress = new Uri(url),
             Timeout = new TimeSpan(0, 2, 0)
        };
            
        httpClient.DefaultRequestHeaders.Add("ContentType", "application/json");
            
        //This is the key section you were missing    
        var plainTextBytes = System.Text.Encoding.UTF8.GetBytes("testing:123456");
        string val = System.Convert.ToBase64String(plainTextBytes);
        httpClient.DefaultRequestHeaders.Add("Authorization", "Basic " + val);
            
        HttpResponseMessage response = httpClient.GetAsync(url).Result;
        string content = string.Empty;
            
        using (StreamReader stream = new StreamReader(response.Content.ReadAsStreamAsync().Result, System.Text.Encoding.GetEncoding(_encoding)))
        {
             content = stream.ReadToEnd();
        }
    

    【讨论】:

    • 非常感谢!!
    【解决方案2】:

    这是我需要的行:

    requestObj.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("username:password"));
    

    【讨论】:

      【解决方案3】:

      我刚刚发现使用 .NET Core 3.1 你可以这样做:

          HttpRequestMessage request = new HttpRequestMessage(
              HttpMethod.Post,
              "your-api-url-here");
      
          request.Headers.Authorization = new BasicAuthenticationHeaderValue(username, password);
      

      【讨论】:

        【解决方案4】:

        我认为您的 API 可能需要添加标头(如果您还没有这样做的话)。看看这篇文章: https://en.wikipedia.org/wiki/Basic_access_authentication#Client_side

        但本质上,您的 API 需要添加一个 Authorization 标头。 Authorization 密钥将包含单词Basic 后跟一个空格,然后是使用Base64 加密的用户名和密码。因此,在您的实例中,testing:123456 将使用 base64 加密为dGVzdGluZzoxMjM0NTY=。所以标题记录将如下所示:

        Authorization: Basic dGVzdGluZzoxMjM0NTY=

        【讨论】:

        • 非常感谢!!我就是这么做的
        【解决方案5】:

        (基本身份验证)这是调用已验证 API 的另一种解决方案

         class Program
        {
            static void Main(string[] args)
            {
                BaseClient clientbase = new BaseClient("https://website.com/api/v2/", "username", "password");
                BaseResponse response = new BaseResponse();
                BaseResponse response = clientbase.GetCallV2Async("Candidate").Result;
            }
        
        
            public async Task<BaseResponse> GetCallAsync(string endpoint)
            {
                try
                {
                    HttpResponseMessage response = await client.GetAsync(endpoint + "/").ConfigureAwait(false);
                    if (response.IsSuccessStatusCode)
                    {
                        baseresponse.ResponseMessage = await response.Content.ReadAsStringAsync();
                        baseresponse.StatusCode = (int)response.StatusCode;
                    }
                    else
                    {
                        baseresponse.ResponseMessage = await response.Content.ReadAsStringAsync();
                        baseresponse.StatusCode = (int)response.StatusCode;
                    }
                    return baseresponse;
                }
                catch (Exception ex)
                {
                    baseresponse.StatusCode = 0;
                    baseresponse.ResponseMessage = (ex.Message ?? ex.InnerException.ToString());
                }
                return baseresponse;
            }
        }
        
        
        public class BaseResponse
        {
            public int StatusCode { get; set; }
            public string ResponseMessage { get; set; }
        }
        
        public class BaseClient
        {
            readonly HttpClient client;
            readonly BaseResponse baseresponse;
        
            public BaseClient(string baseAddress, string username, string password)
            {
                HttpClientHandler handler = new HttpClientHandler()
                {
                    Proxy = new WebProxy("http://127.0.0.1:8888"),
                    UseProxy = false,
                };
        
                client = new HttpClient(handler);
                client.BaseAddress = new Uri(baseAddress);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                var byteArray = Encoding.ASCII.GetBytes(username + ":" + password);
        
                client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
        
                baseresponse = new BaseResponse();
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-07-24
          • 2013-03-31
          • 1970-01-01
          • 2014-01-26
          • 1970-01-01
          • 2017-06-18
          • 1970-01-01
          • 2016-03-04
          • 2018-09-02
          相关资源
          最近更新 更多