通过 TestServer 测试用 [Authorize] 属性修饰的控制器

Mor*_*idt 6 .net-security authorize-attribute oauth-2.0 asp.net-web-api asp.net-core

我的应用程序是一个 ASP.NET Core 1.0 Web API。

我想用TestServer对象测试我的控制器。

我有一个用Authorize属性装饰的控制器类。

我如何获得我的测试客户端:

protected HttpClient GetTestClient(){
         var builder =
            new WebHostBuilder().UseContentRoot(this.path)
               .UseStartup<Startup>()
               .UseEnvironment("Development")
               .ConfigureServices(services => services.AddTransient<IAnInterface, AMock>());

         var server = new TestServer(builder);
         var client = server.CreateClient();

         return client;
      }
Run Code Online (Sandbox Code Playgroud)

我如何使用它的片段:

[TestMethod]
public void ShouldReturnSuccessful()
{
     var response = await this.client.PostAsync(Url, content);
     response.EnsureSuccessStatusCode();
}
Run Code Online (Sandbox Code Playgroud)

如果我Authorize从控制器类中删除该属性,我的所有测试都可以正常工作,但是如果Authorize设置了该属性,我就会明白System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized). 这是有道理的。

现在我知道我可以Bearer Token从请求TestServer并执行以下操作:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "My OAauth token");
Run Code Online (Sandbox Code Playgroud)

但我不想token通过 the请求,TestServer因为我不想在我的应用程序中使用任何用户数据。我认为这是不好的做法。

我想知道是否有任何方法可以在我的代码中没有用户数据的情况下测试控制器?是否有任何解决方法可以使测试通过Authorize属性集?

或者甚至应该可以在Authorize没有任何服务器身份验证的情况下通过?既然TestServer发送了真正的 HTTP 包,这是否意味着这是否可以在没有任何身份验证的情况下进行测试,攻击者也可以在没有身份验证的情况下进入我的应用程序?

任何提示都受到高度赞赏,因为我现在遇到这个问题很多天了。

谢谢