我确实在我的 Web API 上应用了授权属性。我从 MVC4 应用程序调用 Web API,在该应用程序中我使用基于标准 cookie 的身份验证。我需要从集成测试中调用控制器上的 Web API 方法,但由于应用了授权属性,我总是会收到未经授权的异常。
解决这个问题的最佳方法是什么?PS。我不想(需要)使用其他身份验证方法,例如 APIKey、Auth Header 中的令牌和类似方法......
我确实在我的 Web API 上应用了授权属性。我从 MVC4 应用程序调用 Web API,在该应用程序中我使用基于标准 cookie 的身份验证。我需要从集成测试中调用控制器上的 Web API 方法,但由于应用了授权属性,我总是会收到未经授权的异常。
解决这个问题的最佳方法是什么?PS。我不想(需要)使用其他身份验证方法,例如 APIKey、Auth Header 中的令牌和类似方法......
首先,要回答这个问题,一个关键要素是了解您使用哪种身份验证机制。例如,如果您使用基本身份验证,则可以在集成测试时发送凭据:
[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
为另一种选择,但在这里不是我最喜欢的选择。