【问题标题】:Web API Authorization via HttpWebRequest通过 HttpWebRequest 进行 Web API 授权
【发布时间】:2017-11-21 09:34:07
【问题描述】:

我有一个函数可以调用我的 Web API。如果将TestCallingRemotely 设置为[AllowAnonymous],则效果很好。

var httpWebRequest = (HttpWebRequest)WebRequest.Create(
    "http://localhost/api/services/myApp/commonLookup/TestCallingRemotely");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) {
    string input = "{}";

    streamWriter.Write(input);
    streamWriter.Flush();
    streamWriter.Close();
}

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

如何将usernamepassword 传递给HttpWebRequest 进行授权?

我需要从 CLR 集成中调用我的 Web API,它只支持System.Net

【问题讨论】:

    标签: c# asp.net-web-api httpwebrequest aspnetboilerplate http-request-parameters


    【解决方案1】:

    ABP的启动模板uses bearer token authentication infrastructure.

    var token = GetToken(username, password);
    
    // var httpWebRequest = (HttpWebRequest)WebRequest.Create(
    //     "http://localhost/api/services/myApp/commonLookup/TestCallingRemotely");
    // httpWebRequest.ContentType = "application/json";
    // httpWebRequest.Method = "POST";
    
    httpWebRequest.Headers.Add("Authorization", "Bearer " + token);
    
    // ...
    

    获取令牌

    这使用了一种粗略的方式来提取令牌,灵感来自an MSDN article

    private string GetToken(string username, string password, string tenancyName = null)
    {
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(
            "http://localhost:6334/api/Account/Authenticate");
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";
    
        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            var input = "{\"usernameOrEmailAddress\":\"" + username + "\"," +
                        "\"password\":\"" + password + "\"}";
    
            if (tenancyName != null)
            {
                input = input.TrimEnd('}') + "," +
                        "\"tenancyName\":\"" + tenancyName + "\"}";
            }
    
            streamWriter.Write(input);
            streamWriter.Flush();
            streamWriter.Close();
        }
    
        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        string response;
    
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            response = streamReader.ReadToEnd();
        }
    
        // Crude way
        var entries = response.TrimStart('{').TrimEnd('}').Replace("\"", String.Empty).Split(',');
    
        foreach (var entry in entries)
        {
            if (entry.Split(':')[0] == "result")
            {
                return entry.Split(':')[1];
            }
        }
    
        return null;
    }
    

    【讨论】:

      【解决方案2】:

      如果服务器使用基本身份验证,您可以像这样添加标头:

      var httpWebRequest = (HttpWebRequest) WebRequest.Create(
      "http://localhost/api/services/myApp/commonLookup/TestCallingRemotely");
      httpWebRequest.ContentType = "application/json";
      httpWebRequest.Method = "POST";
      
      var username = "Aladdin";
      var password = "opensesame";
      
      var bytes = Encoding.UTF8.GetBytes($"{username}:{password}");
      httpWebRequest.Headers.Add("Authorization", $"Basic {Convert.ToBase64String(bytes)}");
      
      using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
      {
          string input = "{}";
      
          streamWriter.Write(input);
          streamWriter.Flush();
          streamWriter.Close();
      }
      
      var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
      

      【讨论】:

        最近更新 更多