4

Web API に authorize 属性が適用されています。標準の Cookie ベースの認証を使用している MVC4 アプリケーションから Web API を呼び出しています。統合テストからコントローラーで Web API メソッドを呼び出す必要がありますが、authorize 属性が適用されているため、常に不正な例外が発生します。

この問題を解決する最善の方法は何ですか? PS。APIKey、Authヘッダーのトークンなど、他の認証方法を使用したくない(必要ない)...

4

1 に答える 1

0

まず、この質問に答えるために重要な要素の 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ことも別のオプションですが、ここでは私の好みのオプションではありません。

于 2012-11-29T17:34:22.847 に答える