ASP.NET-Core TestServer不接受承载令牌IDX10803 IDX10804

时间:2017-04-27 06:43:12

标签: asp.net-web-api asp.net-core oauth-2.0 asp.net-core-webapi

我的应用程序是ASP.NET Core 1.0 Web API。

我想使用controllers测试我的TestServer。 我有controller类,其中包含Authorize属性。

如果Iam测试控制器而没有使用Authorize属性进行修饰,那么eveything可以正常工作。因此,TestServer设置正确无误。

我执行以下操作来设置AuthenticationHeader

client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", this.RequestToken(client).Result);

并从我的TestServer

请求承载令牌
private async Task<string> RequestToken(HttpClient client)
  {
     var requestTokenUri = "secret";
     var tokenModel = new List<KeyValuePair<string, string>>
                         {
                            new KeyValuePair<string, string>("tokendata", "secret"),
                            new KeyValuePair<string, string>("tokendata", "secret"),
                            new KeyValuePair<string, string>("tokendata", "secret"),
                            new KeyValuePair<string, string>("tokendata", "secret")
                         };

     var tokenPostData = new FormUrlEncodedContent(tokenModel);
     var tokenRequestResult = await client.PostAsync(requestTokenUri, tokenPostData);

     tokenRequestResult.EnsureSuccessStatusCode();

     var body = JObject.Parse(tokenRequestResult.Content.ReadAsStringAsync().Result);
     var token = (string)body["access_token"];

     return token;
  }

这也有效。如果我打印RequestToken(HttpClient)的结果,则会为我提供有效的Bearer token,并且通话tokenRequestResult.EnsureSuccessStatusCode();也会有效。

现在,如果我用Authorize装饰我的控制器并尝试像这样测试我的控制器(剪断)它会失败:

  [TestMethod]
  public async Task ShouldDoSomething()
  {
     // Arrange
     var data = JsonConvert.SerializeObject("Just some data");

     // Test
     var response = await this.client.PostAsync(this.requestUri, jsonContent);

     // Assert
     response.EnsureSuccessStatusCode();
  }

请记住:如果控制器未使用Authorize属性进行修饰,则此方法有效。

但是,如果Iam使用Bearer-tokenAuthenticationHeadervalue执行此操作,Iam会在调用await this.client.PostAsync(this.requestUri, jsonContent);时收到以下错误:

  

Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求启动HTTP / 1.1 GET http://
  Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware:错误:处理消息时发生异常。

     

System.InvalidOperationException:IDX10803:无法从“http://localhost:5000/.well-known/openid-configuration”获取配置。 ---&GT; System.IO.IOException:IDX10804:无法从“http://localhost:5000/.well-known/openid-configuration”检索文档。 ---&GT; System.Net.Http.HttpRequestException:发送请求时发生错误。 ---&GT; System.Net.Http.WinHttpException:Die Serververbindung konnte nicht hergestellt werden      在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)      在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)      在System.Net.Http.WinHttpHandler.d__105.MoveNext()      ---内部异常堆栈跟踪结束---

     

在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)      在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)      在System.Net.Http.HttpClient.d__58.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束---

     

在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)      在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)      在Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.d__8.MoveNext()      ---内部异常堆栈跟踪结束---

     

at Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.d__8.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束---

     

在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)      在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)      在Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.d__3.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束---

     

在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)      在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)      在Microsoft.IdentityModel.Protocols.ConfigurationManager`1.d__24.MoveNext()      ---内部异常堆栈跟踪结束---

     

at Microsoft.IdentityModel.Protocols.ConfigurationManager`1.d__24.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束---

     

在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)      在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)      在Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.d__1.MoveNext()   Ausnahmeausgelöst:System.Private.CoreLib.ni.dll中的“System.InvalidOperationException”   Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求已完成2204.6107ms 200

我尝试将BackchannelHttpHandlerJWTBearerOptions设置为TestServer的{​​{1}}。但这是不可能的,因为我需要一个WebHostBuilder对象来创建我的TestServer

protected HttpClient GetClient(IWebHostBuilder builder)
  {
     if (builder == null)
     {
        builder = new WebHostBuilder().UseContentRoot(GetDirPath())
           .UseStartup<Startup>()
           .UseEnvironment("Development")
           .ConfigureServices(services =>
              {
                 services.AddTransient<IAuthRepo, TestAuthRepo>();
                 services.AddTransient<IOtherRepo, TestOtherRepo>();
              });
     }
     var server = new TestServer(builder);
...

现在我应该如何在创建BackChannelHandler的过程中设置TestServer,而不需要TestServer

任何人都可以帮助我吗?

谢谢

0 个答案:

没有答案