Web API に authorize 属性が適用されています。標準の Cookie ベースの認証を使用している MVC4 アプリケーションから Web API を呼び出しています。統合テストからコントローラーで Web API メソッドを呼び出す必要がありますが、authorize 属性が適用されているため、常に不正な例外が発生します。
この問題を解決する最善の方法は何ですか? PS。APIKey、Authヘッダーのトークンなど、他の認証方法を使用したくない(必要ない)...
Web API に authorize 属性が適用されています。標準の Cookie ベースの認証を使用している MVC4 アプリケーションから Web API を呼び出しています。統合テストからコントローラーで Web API メソッドを呼び出す必要がありますが、authorize 属性が適用されているため、常に不正な例外が発生します。
この問題を解決する最善の方法は何ですか? PS。APIKey、Authヘッダーのトークンなど、他の認証方法を使用したくない(必要ない)...
まず、この質問に答えるために重要な要素の 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
ことも別のオプションですが、ここでは私の好みのオプションではありません。