【问题标题】:How to do ASP.NET Web API integration tests with authorize attribute如何使用授权属性进行 ASP.NET Web API 集成测试
【发布时间】:2012-11-29 12:39:28
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net-mvc unit-testing asp.net-web-api integration-testing basic-authentication


    【解决方案1】:

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

    [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 将是另一种选择,但这不是我最喜欢的选择。

    【讨论】:

    • 感谢您的回答,但我已经指出我正在使用 ASP.NET MVC 4 登录功能,这意味着我通过 ASP.NET MVC 4 网站登录,并且当我向 WebAPI 发出请求时, Authorize 属性将授予我访问权限,因为我在该请求中发送授权 cookie。
    • 目前所有的身份验证都在 ASP.NET MVC 4 中,因为它在同一个项目中是一个 WebAPI。我现在不需要在 WebAPI 中自定义基本身份验证。
    • @RadenkoZec 我假设您正在执行表单身份验证。因此,在我的示例中删除上面的授权标头,并将表单身份验证 cookie 放入请求中。这个想法是一样的。我的例子只是给你一个提示。
    • 我认为将身份验证cookie放入请求的想法必须解决这个问题。我会将您的答案标记为正确并提出另一个关于如何做到这一点的问题:stackoverflow.com/questions/13642466/…
    • @tugberk 当使用 WebApi 2 时,此方法在初始化 WebApi 配置时会引发异常。它说`在应用程序的预启动初始化阶段无法调用此方法`。您是否有类似的 WebApi 2 测试解决方案?
    猜你喜欢
    • 2016-12-29
    • 2020-04-11
    • 2016-09-10
    • 2020-11-23
    • 2014-12-22
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多