我正在尝试使用Microsoft.AspNetCore.TestHost
来测试我使用Azure Active Directory保护的WebAPI。我能够使用PostMan从Azure AD的oauth2 / token端点获取承载令牌,并在'/ api / Values'上调用HTTP GET。但是,当我对TestHost服务器执行相同操作时,我总是会收到401未经授权的错误。
我已将TestHost配置为使用内置于我的ASP.NET Core WebAPI项目中的Startup类(当您使用标准模板并选择Azure Active Directory作为身份验证提供程序时,它是默认生成的类)
Server = new TestServer(
new WebHostBuilder()
.UseStartup<Startup>()
);
我尝试了两种附加承载令牌的方法。
第一种方法,使用我从TestServer生成的客户端的DefaultRequestHeaders:
Client = Server.CreateClient();
Client.DefaultRequestHeaders.Add("Authorization", "Bearer " + AccessToken);
第二种方法是将标题附加到请求本身:
var req = _sut.Server.CreateRequest("/api/Values").AddHeader("Authorization", "Bearer " + _sut.AccessToken);
var response = await req.GetAsync();
但是,这两个都是未经授权的401。
我使用与PostMan相同的方法来获取令牌,除了我的自动单元测试中的代码。
public static string GetAccessToken()
{
string token = null;
// Constants
var tenant = "MY_TENANT_HERE.onmicrosoft.com";
var serviceUri = "https://MY_TENTANT_HERE.com/WebApplicationAAD";
var clientID = "a1d51587-bf4c-4915-b588-8df1d9fd7ac9"; // this is the Application ID for the Native App in Azure AD
var userName = "integration_test@MY_TENANT_HERE.com";
var password = "THE_PASSWORD_FOR_THE_TEST_ACCOUNT";
var appClientId = "d476fd33-4cfc-4aeb-9d4d-ea4978af5660"; // this is the Application ID for the Web API app in Azure AD
using (var webClient = new WebClient())
{
var requestParameters = new NameValueCollection();
requestParameters.Add("grant_type", "password");
requestParameters.Add("client_id", clientID);
requestParameters.Add("username", userName);
requestParameters.Add("password", password);
requestParameters.Add("resource", appClientId);
//requestParameters.Add("scope", "openid");
var url = $"https://login.microsoftonline.com/" + tenant + "/oauth2/token";
var responsebytes = webClient.UploadValues(url, "POST", requestParameters);
var responsebody = Encoding.UTF8.GetString(responsebytes);
var jsonresult = JObject.Parse(responsebody);
token = (string)jsonresult["access_token"];
}
return token;
}
此代码生成令牌。它正在制作我正在做的同一个邮差。
使用相同的技术WORKS在IIS Express托管的WebAPI上执行HTTP GET。
我怀疑AspNetCore.TestHost不支持这一点,或者我没有做正确配置它以点亮我在IIS Express上调试时工作的Azure Active Directory配置,但文档非常清晰。