【问题标题】:IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationHandler[7] .Bearer was not authenticatedIdentityServer4.AccessTokenValidation.IdentityServerAuthenticationHandler[7] .Bearer 未通过身份验证
【发布时间】:2021-05-15 23:57:03
【问题描述】:

当我使用 iis express 运行这个 Asp.Net 核心 webapi 时,它运行良好。但是,如果我使用 docker 容器运行同一个项目,则会显示错误:bearer was challenged.

IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationHandler[12] 我是 | AuthenticationScheme:承载被挑战。 我是 |信息:IdentityServer4.Hosting.IdentityServerMiddleware[0] 我是 |调用 IdentityServer 端点:IdentityServer4.Endpoints.TokenEndpoint for /connect/token 我是 |信息:IdentityServer4.AspNetIdentity.ResourceOwnerPasswordValidator[0] 失败:Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[3] 我是 |处理消息时发生异常。 我是 | System.InvalidOperationException:IDX20803:无法从“https://localhost:8081/.well-known/openid-configuration”获取配置。 我是 | ---> System.IO.IOException:IDX20804:无法从以下位置检索文档:“https://localhost:8081/.well-known/openid-configuration”。 我是 | ---> System.Net.Http.HttpRequestException:无法分配请求的地址(本地主机:8081) 我是 | ---> System.Net.Sockets.SocketException (99): 无法分配请求的地址 我是 |在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError 错误,CancellationToken cancelToken) 我是 |在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 令牌) 我是 |在 System.Net.Sockets.Socket.g__WaitForConnectWithCancellation|283_0(AwaitableSocketAsyncEventArgs saea,ValueTask connectTask,CancellationToken cancelToken) 我是 |在 System.Net.Http.HttpConnectionPool.DefaultConnectAsync(SocketsHttpConnectionContext 上下文,CancellationToken cancelToken) 我是 |在 System.Net.Http.ConnectHelper.ConnectAsync(Func3 callback, DnsEndPoint endPoint, HttpRequestMessage requestMessage, CancellationToken cancellationToken) iam | --- End of inner exception stack trace --- iam | at System.Net.Http.ConnectHelper.ConnectAsync(Func3 回调,DnsEndPoint 端点,HttpRequestMessage requestMessage,CancellationToken cancelToken) 我是 |在 System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage 请求,布尔异步,CancellationToken 取消令牌) 我是 |在 System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage 请求,布尔异步,CancellationToken cancelToken) 我是 |在 System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage 请求,布尔异步,CancellationToken cancelToken) 我是 |在 System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage 请求,布尔异步,布尔 doRequestAuth,CancellationToken 取消令牌) 我是 |在 System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage 请求,布尔异步,CancellationToken cancelToken) 我是 |在 System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage 请求,布尔异步,CancellationToken cancelToken) 我是 |在 System.Net.Http.HttpClient.SendAsyncCore(HttpRequestMessage 请求,HttpCompletionOption 完成选项,布尔异步,布尔 emitTelemetryStartStop,CancellationToken 取消令牌) 我是 |在 Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(字符串地址,CancellationToken 取消) 我是 | --- 内部异常堆栈跟踪结束 --- 我是 |在 Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(字符串地址,CancellationToken 取消) 我是 |在 Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.GetAsync(字符串地址,IDocumentRetriever 检索器,CancellationToken 取消) 我是 |在 Microsoft.IdentityModel.Protocols.ConfigurationManager1.GetConfigurationAsync(CancellationToken cancel) iam | --- End of inner exception stack trace --- iam | at Microsoft.IdentityModel.Protocols.ConfigurationManager1.GetConfigurationAsync(CancellationToken 取消) 我是 |在 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync() 我是 |失败:IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationHandler[0] 我是 | IDX20803:无法从“https://localhost:8081/.well-known/openid-configuration”获取配置。 我是 | System.InvalidOperationException:IDX20803:无法从“https://localhost:8081/.well-known/openid-configuration”获取配置。 我是 | ---> System.IO.IOException:IDX20804:无法从以下位置检索文档:“https://localhost:8081/.well-known/openid-configuration”。 我是 | ---> System.Net.Http.HttpRequestException:无法分配请求的地址(本地主机:8081) 我是 | ---> System.Net.Sockets.SocketException (99): 无法分配请求的地址 我是 |在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError 错误,CancellationToken cancelToken) 我是 |在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 令牌) 我是 |在 System.Net.Sockets.Socket.g__WaitForConnectWithCancellation|283_0(AwaitableSocketAsyncEventArgs saea,ValueTask connectTask,CancellationToken cancelToken) 我是 |在 System.Net.Http.HttpConnectionPool.DefaultConnectAsync(SocketsHttpConnectionContext 上下文,CancellationToken cancelToken) 我是 |在 System.Net.Http.ConnectHelper.ConnectAsync(Func3 callback, DnsEndPoint endPoint, HttpRequestMessage requestMessage, CancellationToken cancellationToken) iam | --- End of inner exception stack trace --- iam | at System.Net.Http.ConnectHelper.ConnectAsync(Func3 回调,DnsEndPoint 端点,HttpRequestMessage requestMessage,CancellationToken cancelToken) 我是 |在 System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage 请求,布尔异步,CancellationToken 取消令牌) 我是 |在 System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage 请求,布尔异步,CancellationToken cancelToken) 我是 |在 System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage 请求,布尔异步,CancellationToken cancelToken) 我是 |在 System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage 请求,布尔异步,布尔 doRequestAuth,CancellationToken 取消令牌) 我是 |在 System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage 请求,布尔异步,CancellationToken cancelToken) 我是 |在 System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage 请求,布尔异步,CancellationToken cancelToken) 我是 |在 System.Net.Http.HttpClient.SendAsyncCore(HttpRequestMessage 请求,HttpCompletionOption 完成选项,布尔异步,布尔 emitTelemetryStartStop,CancellationToken 取消令牌) 我是 |在 Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(字符串地址,CancellationToken 取消) 我是 | --- 内部异常堆栈跟踪结束 --- 我是 |在 Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(字符串地址,CancellationToken 取消) 我是 |在 Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.GetAsync(字符串地址,IDocumentRetriever 检索器,CancellationToken 取消) 我是 |在 Microsoft.IdentityModel.Protocols.ConfigurationManager1.GetConfigurationAsync(CancellationToken cancel) iam | --- End of inner exception stack trace --- iam | at Microsoft.IdentityModel.Protocols.ConfigurationManager1.GetConfigurationAsync(CancellationToken 取消) 我是 |在 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync() 我是 |在 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync() 我是 |在 Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync() 我是 |在 Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext 上下文,字符串方案) 我是 |在 IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationHandler.HandleAuthenticateAsync() 我是 |信息:IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationHandler[7]

【问题讨论】:

    标签: asp.net-core docker-compose asp.net-core-webapi identityserver4 asp.net-core-3.1


    【解决方案1】:

    您不能在容器内使用 https://localhost:8081,您需要配置您的 IdentityServer 的 URL,以便可以从容器内访问它。我假设您将 IdentityServer 放在容器外的单独服务上。

    查看此question 和此链接:

    【讨论】:

    • 我试过这个,但仍然是同样的问题。我可以访问 /connect/token。之后,当我发送任何请求时。无法得到任何回应。报错如上所示。
    • 您可以以交互方式登录到您的容器techeplanet.com/login-to-docker-container,然后使用 curl 尝试向您的发现端点发出请求并调试您的网络问题。
    猜你喜欢
    • 2017-07-24
    • 2015-11-04
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    相关资源
    最近更新 更多