2013-03-27 28 views
3

我試圖進入內存託管工作集成測試我們的web api項目,但在使用它時遇到了身份驗證問題。我使用默認的Web Api模板和它創建的值控制器在基本的Web Api項目上重新創建了這個項目。ASP.NET Web API:在集成測試的內存託管中使用驗證

我們使用的是Autofac,所以在測試中也包含了這一點。我們也爲web api使用windows身份驗證,但爲了測試的目的,這並不重要。

問題是測試中的「服務器」始終返回「授權已被拒絕此請求。」

那麼使用內存服務器進行授權的最佳方式是什麼?我已經註釋掉了另一個stackoverflow問題的一些代碼,但是這似乎也沒有工作。

using System; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Web.Http; 
using Autofac; 
using Autofac.Integration.WebApi; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using WebApiTesting.Controllers; 

namespace WebApiTesting.Tests.Controllers 
{ 
    [TestClass] 
    public class ValuesControllerTest 
    { 
     private const string URL = "http://test.testing.com/"; 
     private const string Username = "user"; 
     private const string Password = "supersecret"; 

     [TestMethod] 
     public void InMemoryHosting() 
     { 
      var config = new HttpConfiguration(); 
      config.Routes.MapHttpRoute(name: "DefaultApi", 
             routeTemplate: "api/{controller}/{id}", 
             defaults: new {id = RouteParameter.Optional}); 
      config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

      var server = new HttpServer(config); 
      var builder = new ContainerBuilder(); 
      // Register API controllers using assembly scanning. 
      builder.RegisterApiControllers(typeof(ValuesController).Assembly); 
      var container = builder.Build(); 
      server.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

      var client = new HttpClient(server); 
      using (var request = CreateRequest("api/values", "application/json", HttpMethod.Get)) 
      { 
       //Act 
       using (HttpResponseMessage response = client.SendAsync(request).Result) 
       { 
        // Assert 
        Assert.IsNotNull(response.Content); 
        Assert.AreEqual("application/json", response.Content.Headers.ContentType.MediaType); 
        var content = response.Content.ReadAsStringAsync().Result; 
        Assert.AreNotEqual("{\"Message\":\"Authorization has been denied for this request.\"}", content); 
       } 
      } 
     } 

     private HttpRequestMessage CreateRequest(string url, string mthv, HttpMethod method) 
     { 
      var request = new HttpRequestMessage { RequestUri = new Uri(URL + url) }; 
      /*byte[] toEncodeAsBytes = Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Username, Password)); 
      request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(toEncodeAsBytes));*/ 
      request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv)); 
      request.Method = method; 
      return request; 
     } 
    } 
} 

回答

4

只是爲了記錄到底是什麼工作,我添加了下面一行到我的createRequest方法

Thread.CurrentPrincipal = new ClientRolePrincipal(new HttpListenerBasicIdentity(Username, Password)); 

我真的不知道這是處理的最佳方式,但它至少工作。

+0

我不確定這是否是處理它的最佳方式,但它是Microsoft推薦的方式。 – msfanboy 2014-02-02 20:04:57

+0

@msfanboy - 這個微軟建議的鏈接將不勝感激 – 2015-08-20 11:19:10

相關問題