4

我确实在我的 Web API 上应用了授权属性。我从 MVC4 应用程序调用 Web API,在该应用程序中我使用基于标准 cookie 的身份验证。我需要从集成测试中调用控制器上的 Web API 方法,但由于应用了授权属性,我总是会收到未经授权的异常

解决这个问题的最佳方法是什么?PS。我不想(需要)使用其他身份验证方法,例如 APIKey、Auth Header 中的令牌和类似方法......

4

1 回答 1

0

首先,要回答这个问题,一个关键要素是了解您使用哪种身份验证机制。例如,如果您使用基本身份验证,则可以在集成测试时发送凭据:

[Fact]
public async Task FooTest() { 

    var username = "user";
    var password = "supersecret";

    // construct your config here as I do below.
    // RouteConfig and WebAPIConfig are my own classes
    var config = new HttpConfiguration();
    RouteConfig.RegisterRoutes(config);
    WebAPIConfig.Configure(config);

    var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/api/cars");
    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    request.Headers.Authorization = new AuthenticationHeaderValue(
        "Basic", EncodeToBase64(string.Format("{0}:{1}", username, password)));

    using (var httpServer = new HttpServer(config))
    using (var client = new HttpClient(httpServer)) {

        var response = await client.SendAsync(request);
        var result = await response.Content.ReadAsAsync<Car>();

        // do you test now...
    }
}

private static string EncodeToBase64(string value) {

    byte[] toEncodeAsBytes = Encoding.UTF8.GetBytes(value);
    return Convert.ToBase64String(toEncodeAsBytes);
}

当然,处理身份验证的处理程序应该能够使用这些凭据对您进行身份验证。

另一方面,由于您将在内存中托管应用程序,因此将经过身份验证的主体设置Thread.CurrentPrincipal为另一种选择,但在这里不是我最喜欢的选择。

于 2012-11-29T17:34:22.847 回答