【问题标题】:Identity server 4 deployment on Azure App Service Certificate (dev) issueAzure App Service Certificate (dev) 问题上的 Identity server 4 部署
【发布时间】:2017-10-13 18:15:33
【问题描述】:

在 Azure 应用服务上部署身份服务器时遇到问题。以下是设置。

JSclient 在本地托管。 身份验证服务器位于 Azure 应用服务上。

                var certificate = SSLHelper.GetCertificateCurrentUserMyStore(signingsslthumbprint);
            builder
                .AddSigningCredential(certificate)
                .AddSecretParser<ClientAssertionSecretParser>()
                .AddSecretValidator<PrivateKeyJwtSecretValidator>()
                .AddAspNetIdentity<User>()
                .AddProfileService<ProfileService>();

我创建了两个证书,一个用于签名,另一个用于交换。

`New-SelfsignedCertificateEx -Subject "CN=devsignature" -EKU 1.3.6.1.5.5.7.3.3 -KeySpec "Signature" -KeyUsage "DigitalSignature" -StoreLocation "CurrentUser" -SAN $domains -SignatureAlgorithm "SHA256" - KeyLength 2048 -FriendlyName "DevSignature" -NotAfter $([System.DateTime]::Now.AddYears(15)) -Exportable

New-SelfsignedCertificateEx -Subject "CN=*.mydomain.com" -EKU 1.3.6.1.5.5.7.3.1 -KeySpec "Exchange" -KeyUsage "DigitalSignature" -StoreLocation "CurrentUser" -SAN $domains -SignatureAlgorithm " SHA256" -KeyLength 2048 -FriendlyName "DEVExchange" -NotAfter $([System.DateTime]::Now.AddYears(15)) -Exportable`

以下是用于检索所有证书的应用服务设置。

当我在 Windows 机器上部署身份验证服务器(不是本地机器,而是在另一台服务器上)时,这有效。但是,当我部署到 IIS 时 ...

   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>d__6.MoveNext() | Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke

119 | 2017-05-14 20:32:04.4131 | RD0003FF635548 |错误 |异常处理程序中间件 | AsyncTaskMethodBuilder.Start => d__8.MoveNext => ExceptionHandlerMiddleware.Invoke |发生未处理的异常:未配置签名凭据。无法创建 JWT 令牌EXCEPTIONSystem.InvalidOperationException:未配置签名凭据。无法创建 JWT 令牌

我正在使用开发证书(不是真正的)。因此,这是用于分阶段部署。

过去两天一直在尝试,但无法正常工作。

编辑:这甚至没有命中 api 服务器。这只是JSClient登录重定向到-> AuthServer的时候。

有人可以帮忙吗?

谢谢,

编辑:

感谢@moritzg 和@Austin Dimmer,让我更进一步。现在,当我使用令牌调用 webapi 时,它会抛出“IDX10803:无法从:'https://myauthserver.com/.well-known/openid-configuration'获取配置”。

有什么想法吗?

编辑2:

以下是来自 api 服务器的调试日志

643 | RD0003FF635548 | DEBUG | LoggingConnectionFilter | MoveNextRunner.InvokeMoveNext => <ReadAsync>d__16.MoveNext =>

LoggingStream.Log |异步读取[2266] 47 45 54 20 2F 61 70 69 2F 63 6F 6F 6D 6D 6F 6E 2F 63 61 74 61 ...... 获取 /api/myendpoint HTTP/1.1 Cache-Control:无缓存连接:Keep-Alive Pragma: no-cache Accept: text/plain Accept-Encoding: gzip, deflate, sdch, br Accept-Language: en-US,en;q=0.8 Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IkVEQTYsdfsdfdsfsdfdsfdscHM6......... 饼干:ARRAffinity=e414d40c85d90229be06c3c9de2fzxczxczxc3....... 主机:myapiserver 最大转发数:10 推荐人: https://myapiserver/swagger/ 用户代理:Mozilla/5.0(Windows NT 10.0; WIN64; x64) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome/58.0.3029.110 Safari/537.36 X-Live 升级:1 X-WAWS-Unencoded-URL:/api/myendpoint X-Original-URL:/api/myendpoint X-ARR-LOG-ID:7c2afdfe4c-d3ea-dfer-9570-ffgfgfgfgfd 伪装主机: myapiserver X-SITE-DEPLOYMENT-ID:myapiserver WAS-DEFAULT-HOSTNAME: myapiserver.azurewebsites.net X-Forwarded-For: XXX.XXX.XXX.XXX:XXXXX, XXX.XXX.XXX.XXX:XXXXX X-ARR-SSL: 2048|256|C=XX, S=XXXXX, L=XXXXX, O=XXXX, OU=IT, CN=.mydoamin.com, E=xxx@xxx.com|C=XX, S=XXXXX, L=XXXX, O=XXXXX,OU=IT,CN=.mydomain.com,E=xxx@xxx.com MS-ASPNETCORE-TOKEN: XXX-XXX-XXX-XXXX-XXXXXXXXX X-Forwarded-Proto:https

| Microsoft.AspNetCore.Server.Kestrel.Filter.Internal.LoggingStream.Log 650 | RD0003FF635548 |调试 |记录连接过滤器 | StreamSocketOutput.ProducingComplete => LoggingStream.Write => LoggingStream.Log |写[111] 48 54 54 50 2F 31 2E 31 20 35 30 30 20 49 6E 74 65 72 6E 61 6C 20 53 65 72 76 65 72 20 45 72 72 6F 72 0D 0A 44 61 74 65 3A 20 57 65 64 2C 20 31 37 20 4D 61 ...... HTTP/1.1 500 内部服务器错误日期:XXXXXXXXXXXXXXXXXXXXXX 内容长度:0 服务器:红隼

| Microsoft.AspNetCore.Server.Kestrel.Filter.Internal.LoggingStream.Log 651 | RD0003FF635548 |调试 |红隼 | Frame.WriteSuffix => Connection.Microsoft.AspNetCore.Server.Kestrel.Internal.Http.IConnectionControl.End => KestrelTrace.ConnectionKeepAlive |连接 ID“0HL4SVIU4EDP3”已完成保持活动响应。 | Microsoft.AspNetCore.Server.Kestrel.Internal.KestrelTrace.ConnectionKeepAlive

以下是来自 API 服务器的错误日志

at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>d__6.MoveNext()

| Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware+d__6.MoveNext 610 | RD0003FF635548 |错误 |红隼 | d__2.MoveNext => Frame.ReportApplicationError => KestrelTrace.ApplicationError |连接 ID“0HL4SVIU4EDP2”:未处理的异常由 application.EXCEPTIONSystem.InvalidOperationException:IDX10803: 无法从以下位置获取配置: 'https://myauthserver/.well-known/openid-configuration'。 ---> System.IO.IOException:IDX10804:无法从以下位置检索文档: 'https://myauthserver/.well-known/openid-configuration'。 ---> System.Net.Http.HttpRequestException:发送时出错 请求。 ---> System.Net.Http.WinHttpException:安全错误 发生在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
在 System.Net.Http.WinHttpHandler.d__105.MoveNext()
--- 内部异常堆栈跟踪结束 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task 任务)在 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() --- 内部异常堆栈跟踪结束 --- 在 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(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
在 Microsoft.IdentityModel.Protocols.ConfigurationManager1.<GetConfigurationAsync>d__24.MoveNext() --- End of inner exception stack trace --- at Microsoft.IdentityModel.Protocols.ConfigurationManager1.d__24.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.<HandleAuthenticateAsync>d__1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.<HandleAuthenticateAsync>d__1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() 在 Microsoft.AspNetCore.Authentication.AuthenticationHandler1.<InitializeAsync>d__52.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware
1.d__18.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationMiddleware.d__7.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.GetResult()
在 Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.d__7.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.GetResult()
在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.d__6.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.d__6.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.GetResult()
在 Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.d__8.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.GetResult()
在 Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware.d__3.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
在 Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`1.d__2.MoveNext() | Microsoft.AspNetCore.Server.Kestrel.Internal.KestrelTrace.ApplicationError

Identity Server (AuthServer) 本身没有生成日志。

我在调试日志中发现了以下一些有趣的地方

WAS-DEFAULT-HOSTNAME:myapiserver.azurewebsites.net

这是指向 Azurewebsite url 而不是 myapiserver.mydomain.com,我已经在 azure 域设置中配置了它。不确定这是否对此有任何影响,但无论如何......

最终编辑:

我已经找到了这个问题的根源。基本上在应用服务中,您只能访问 CurrentUser 的个人商店,这意味着自签名证书将不起作用。您将需要购买一个真实的。 (对 Mircorsoft Azure 赞不绝口!)。

谢谢

【问题讨论】:

  • 刚刚注意到您的编辑,当您的 resource server (webapi) 无法访问 IdentityServer 时,您会遇到错误。或者你以某种方式弄乱了那个 URL。你能检查一下你是否可以访问它吗?
  • 我可以使用浏览器访问该网址('myauthserver.com/.well-known/openid-configuration'.)。
  • 有趣的是,Identity Server 4 文档docs.identityserver.io/en/release/topics/apis.html 上有一篇文章建议启用对 .NET 框架 452 的 TLS 支持。在 Azure App Service 上,它配置为 4.6。因此,我尝试了该文档中给出的 bith 452 和 462,但它仍然失败。仅供参考,我正在为应用程序使用 dotnet core。
  • 好的,您可以打开您的IdentityServer 登录并将日志粘贴到这里吗?我认为这绝对是证书问题。

标签: ssl deployment oauth identityserver4 azure-web-app-service


【解决方案1】:

您确定您的设置正确吗?这是我们制作证书的方式:

  • 将证书上传到 Azure SSL
  • 使用带有指纹的WEBSITE_LOAD_CERTIFICATES

并像这样在我的ConfigureServices:`中使用它

var certs = new X509Certificate2Collection();

if (CurrentEnvironment.IsDevelopment())
{
       certs.Add(new X509Certificate2(Configuration["X509Certificate:CertificateName"], Configuration["X509Certificate:CertificatePassword"]));
 } else
 {
       var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
       store.Open(OpenFlags.ReadOnly);
       certs = store.Certificates.Find(X509FindType.FindByThumbprint, Configuration["WEBSITE_LOAD_CERTIFICATES"], false);
 }

然后:.AddSigningCredential(certs[0])

【讨论】:

  • 是的,这也是我们所拥有的。当找不到证书时,我已经抛出新异常。但这并没有被抛出,这让我认为这不是问题所在。这是我得到的错误...“未配置签名凭据。无法创建 JWT 令牌”!!!
  • 已对此进行进一步调查。好像在上面使用它找不到证书!引发未处理的异常:System.ArgumentOutOfRangeException:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引异常...
  • 想知道指纹的格式是什么。是否有从证书复制指纹的特定方法?我的是 xxxxxx.. 而不是 xx xx xx... 格式。
  • @activebiz 如果您获得的是ArgumentOutOfRangeException,它将找不到证书。您需要在您的应用服务中将证书上传到Settings &gt; SSL certificates。上传后,您可以看到指纹。这是一个 40 个字符的字符串,看起来有点像这样:DB8RG3HJ9... 我的也是 xxxx,所以应该是正确的。
【解决方案2】:

如果您正在运行 IIS,请检查运行 Appool 帐户的帐户是否有权访问证书的私钥。

启动 MMC 添加证书插件,然后选择您的证书并转到操作 -> 所有任务 -> 管理私钥并确保该帐户具有正确的权限。

也许也将证书放在 LocalMachine 而不是 CurrentUser 中?

最后检查安全组/防火墙问题是否阻止从服务器到域并返回到服务器的通信。我们在 AWS ElasticBeanstalk 环境中观察到类似的问题('IDX10803: Unable to get configuration from: 'https://myauthserver.com/.well-known/openid-configuration')。

祝你好运!

【讨论】:

  • 谢谢,但是这个问题是在 Azure 应用服务上运行时出现的(如上所述)。当我部署到 Machine 时,它​​运行良好。
  • 不太清楚你为什么在这里投了我的票。我只是想提供帮助。
  • 考虑到这一点,我只是想提出关于“可能出错”的想法。在应用服务环境中,我假设实例位于负载均衡器后面。在这种情况下,我知道身份服务器上的文档可能很有用。 identityserver.github.io/Documentation/docsv2/advanced/… 也许这些资源也可以给你一些想法github.com/IdentityServer/IdentityServer3/… 或更具体地为 IdentityServer 4 github.com/IdentityServer/IdentityServer4/issues/213
  • 请不要私信。我很感谢你的意见。问题很清楚,问题出在 Azure 应用服务上,而不是在本地盒子上,因此被否决了。我认为 github 上很少有其他人有同样的问题,所以如果我们能找到它,它也会对其他人有用。
  • 在我的情况下没有负载均衡器,所以这不是问题
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2020-08-14
  • 2019-03-31
  • 2021-06-02
  • 2020-08-23
  • 2019-02-17
相关资源
最近更新 更多