【问题标题】:Test secured WebAPI with HttpRequestMessage使用 HttpRequestMessage 测试安全的 Web API
【发布时间】:2013-12-16 01:56:25
【问题描述】:

我正在尝试测试我的 Web API

  [Test]
    public void PolicyController_GetFirstPage_Successful()
    {
        using (var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/api/policies/~/~/0"))
        {
            using (var response = Client.SendAsync(request, CancellationToken.None).Result)
            {
              //blah blah
            }
        }
    }

但我的控制器的操作具有[Authorize] 属性,所以我收到未经授权的错误。

我该如何处理这种情况?

【问题讨论】:

    标签: c# asp.net testing asp.net-web-api


    【解决方案1】:

    首先您需要获取访问令牌。然后您可以在标头内发送带有访问令牌的 GET 请求。您可以在此处阅读更多相关信息:http://msdn.microsoft.com/en-us/library/hh454950.aspx

    这是工作控制台应用程序示例。它是相当硬编码的,但在我的测试应用中运行良好,所以我希望它对你有用。

    namespace ConsoleApplication
    {
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("App started");
    
            var tokenUrl = "http://localhost:29825/token";
            var userName = "stack";
            var userPassword = "password";
            var request = string.Format("grant_type=password&username={0}&password={1}", HttpUtility.UrlEncode(userName), HttpUtility.UrlEncode(userPassword));
            var token = HttpPost(tokenUrl, request);
            var url = "http://localhost:29825/api/clients";
            var clients =  HttpGet(url, token.access_token);
    
            foreach (var client in clients)
            {
                Console.WriteLine(client.Name);
            }
    
            Console.WriteLine("Press Enter to quit");
            Console.ReadLine();
        }
    
    
        private static AccessToken HttpPost(string tokenUrl, string requestDetails)
        {
            WebRequest webRequest = WebRequest.Create(tokenUrl);
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.Method = "POST";
            byte[] bytes = Encoding.ASCII.GetBytes(requestDetails);
            webRequest.ContentLength = bytes.Length;
            using (Stream outputStream = webRequest.GetRequestStream())
            {
                outputStream.Write(bytes, 0, bytes.Length);
            }
            using (WebResponse webResponse = webRequest.GetResponse())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AccessToken));
    
                AccessToken token = (AccessToken)serializer.ReadObject(webResponse.GetResponseStream());
    
                return token;
            }
        }
    
        private static List<Client> HttpGet(string url, string token)
        {
            WebRequest webRequest = WebRequest.Create(url);
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.Method = "GET";
            webRequest.Headers.Add("Authorization", "Bearer " + token);
    
            using (WebResponse webResponse = webRequest.GetResponse())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<Client>));
    
                List<Client> clients = (List<Client>)serializer.ReadObject(webResponse.GetResponseStream());
    
                return clients;
            }
        }
    
        [DataContract]
        public class AccessToken
        {
            [DataMember]
            public string access_token { get; set; }
    
            [DataMember]
            public string token_type { get; set; }
    
            [DataMember]
            public string expires_in { get; set; }
    
            [DataMember]
            public string userName { get; set; }
        }
    
        [DataContract]
        public class Client
        {
            [DataMember]
            public string Id { get; set; }
            [DataMember]
            public string Name { get; set; }
        }
    
    }
    

    }

    【讨论】:

    • 不确定它是否与我的要求有关。我没有使用 azure,也没有使用 Translator Api。
    • 是的,它是相关的。我在答案中添加了示例。
    • 对不起,你一定误会了我。或者我不清楚,我正在对我的 web api 控制器进行单元测试。
    【解决方案2】:

    我刚刚设置了 Thread.CurrentPrincipal,它现在可以正常工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 2014-06-08
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多