【问题标题】:Testing WebAPI actions that have authorization filters测试具有授权过滤器的 WebAPI 操作
【发布时间】:2012-09-05 13:17:39
【问题描述】:

我有一个添加了 [Authorize] 属性的 Web API,这意味着我之前的单元测试现在由于未经授权而失败。下面是一个基本测试的示例以及一个初始化方法:

[TestInitialize]
public void CreateServer() {
    var config = new HttpConfiguration();
    WebApiConfig.Configure(config); // Create the routes
    var server = new HttpServer(config);
    this.client = new HttpClient(server);
}

[TestMethod]
public void MyThings_GET_Returns_All_MyThings() {
    var response = this.client.GetAsync("http://localhost/api/1.0/mythings").Result;

    var mythings = response.Content.ReadAsAsync<IEnumerable<MyThing>>().Result;

    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
    Assert.AreEqual(4, mythings.Count());
}

我想知道是否有任何方法可以让我的测试登录以便它通过授权过滤器,或者是否有任何方法可以作为 ASPXAUTH cookie 与 HttpClient 请求一起传递?还是我没有想到的其他通过授权的方式?

我尝试过的任何方法似乎都不起作用,而且我很难在任何地方找到任何有用的信息。

提前致谢。

【问题讨论】:

  • 如果您的授权过滤器在标头中查找数据,那么您可以使用 httpclient 的 SendAsync 传入带有必要标头的构造 httprequestmessage

标签: unit-testing asp.net-web-api dotnet-httpclient


【解决方案1】:

您的 Authorize 属性在执行授权检查时有什么作用?我想到了很多选项:

  • 让授权过滤器支持多种获取所需“授权令牌”的方式(例如,通过 HTTP 标头或查询字符串参数等)
  • 在测试初始化​​之后,立即从配置中清除过滤器(这样它就不会被调用)。如果您选择走这条路线,那么您可能希望弹出一个新过滤器,该过滤器设置任何可能在管道中进一步使用的授权值
  • 如果您使用依赖注入,请将“授权检查”移动到某种可以在您的配置中更新的IAuthorize 位置

我还建议使用RestSharp 对您的端点进行查询,因为它在指定标头、参数等方面做得非常好。

【讨论】:

  • RestSharp 看起来会做我想做的事,因为我可以让我的测试初始化​​程序进行身份验证并获取一个 cookie,然后 RestSharp 可以在其余的测试中使用它。谢谢:)
  • 实际上看 RestSharp,我看不到设置它的方法,以便所有请求都发送到我正在使用的内部内存 HttpServer (System.Net.Http.HttpServer)测试。它似乎只能将请求发送到适当的服务器——或者我错过了什么?
  • 在回答您的问题时,我应该在急于尝试 RestSharp 之前回答这个问题,它是您可以在 WebAPI 中使用的标准 [Authorize(Users="...")] 属性。它使用 SimpleMembershipProvider 来检查我数据库中的用户表。我对 SimpleMembershipProvider 不太熟悉,但它现在是 MVC4 中的标准,所以我正在使用它。
【解决方案2】:

我认为我解决问题的方式根本上是错误的。在 Web API 中使用基于 cookie 的授权并不是一个好主意,所以我决定摆脱授权属性并执行基于 API-Key 的身份验证。这使得测试更容易,因为我可以在请求中传递正确的 API 密钥,但也意味着我不依赖 cookie 进行授权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2011-07-02
    • 2012-07-14
    相关资源
    最近更新 更多