AspNetCore.TestHost是否支持Azure Active Directory?

时间:2017-11-09 00:58:54

标签: azure asp.net-core azure-active-directory asp.net-core-webapi asp.net-core-testhost

我正在尝试使用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;
}

此代码生成令牌。它正在制作我正在做的同一个邮差。

get token using postman

使用相同的技术WORKS在IIS Express托管的WebAPI上执行HTTP GET。

WebAPI calls with bearer token attached working too

我怀疑AspNetCore.TestHost不支持这一点,或者我没有做正确配置它以点亮我在IIS Express上调试时工作的Azure Active Directory配置,但文档非常清晰。

0 个答案:

没有答案