如果在IIS中托管,IdentityServer API将未经授权。

7 浏览
0 Comments

如果在IIS中托管,IdentityServer API将未经授权。

我按照这里的说明,向Duende IdentityServer 6.2添加了额外的API。然后我尝试使用他们自己的库(称为AccessTokenManagement或Identity.Model)中的typed httpClient从示例应用程序访问它,基本上按照他们的简单示例进行操作。我使用了授权码流程,一切都很简单和默认。

当服务器和客户端都位于同一台开发机器的localhost上时,它运行良好。但是,一旦我将IdentityServer发布到IIS上,API就停止工作了,而其他部分仍然工作正常(我可以进行身份验证,并且在Fiddler中可以看到令牌交换正常工作)。

对API的调用包括两个步骤:

  1. 使用刷新令牌调用/connect/token。服务器返回访问令牌。
  2. 使用这个新的访问令牌调用我的端点。

该流程在步骤1上失败。对/connect/token的调用已经是未经授权的,我无法理解为什么。"好"和"坏"的调用看起来是一样的,我看不到任何区别。之前在不久之前对/connect/userinfo的调用也包括相同的两个步骤,它可以正常工作。服务器和客户端的日志都没有给出任何线索。

没有反向代理,只有简单的URI。自动密钥管理已启用,并且密钥存储在SQL表中,对于开发和已发布的服务器是共用的。启用了Asp.Net Core数据保护,并且密钥也是共用的。

下面是日志的相关部分。我注意到"未找到请求路径的端点条目"是特定于IdentityServer的,它实际上并不意味着找不到端点。它找到了,但没有处理。我还注意到在坏请求中的响应头和关于"已签入Cookie"的日志条目,但不确定它的含义和是否相关。

我已经没有更多的想法了。

在尝试获取新的访问令牌时,从IIS收到的错误响应:

Bad response from IIS while trying to get new Access Token

在开发过程中收到的正确响应:

Proper response while developing

///////坏请求的相关日志部分
|Duende.AccessTokenManagement.OpenIdConnect.UserAccessAccessTokenManagementService|用户test@test.com的令牌需要刷新。
|Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler|身份验证方案:cookie已成功验证。
|Duende.AccessTokenManagement.OpenIdConnect.UserTokenEndpointService|刷新令牌请求至:https://auth.mysite.org/connect/token
|Duende.AccessTokenManagement.OpenIdConnect.UserAccessAccessTokenManagementService|刷新访问令牌时出错。错误=未经授权
|System.Net.Http.HttpClient.IdsService.ClientHandler|发送HTTP请求POST https://auth.mysite.org/mycontroller/myaction
|System.Net.Http.HttpClient.IdsService.ClientHandler|收到HTTP响应头,用时117.7278ms - 401
 ///////相同部分的良好请求
|Duende.AccessTokenManagement.OpenIdConnect.UserAccessAccessTokenManagementService|用户test@test.com的令牌需要刷新。
|Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler|身份验证方案:Cookies已成功验证。
|Duende.AccessTokenManagement.OpenIdConnect.UserTokenEndpointService|刷新令牌请求至:https://localhost:5001/connect/token
|Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler|身份验证方案:Cookies已签入。
|System.Net.Http.HttpClient.IdsService.ClientHandler|发送HTTP请求POST https://localhost:5001/mycontroller/myaction
|System.Net.Http.HttpClient.IdsService.ClientHandler|收到HTTP响应头,用时1994.9611ms - 200
///////BAD请求期间的服务器日志
Duende.IdentityServer.Hosting.EndpointRouter 未找到请求路径的端点条目:"/mycontroller/myaction"
Duende.IdentityServer.Hosting.LocalApiAuthentication.LocalApiAuthenticationHandler 调用HandleAuthenticateAsync
Duende.IdentityServer.Hosting.LocalApiAuthentication.LocalApiAuthenticationHandler 身份验证方案:"IdentityServerAccessToken"未经身份验证。
Duende.IdentityServer.Hosting.LocalApiAuthentication.LocalApiAuthenticationHandler 身份验证方案:"IdentityServerAccessToken"被挑战。

0
0 Comments

问题的原因是IIS拦截了身份验证服务器API的基本身份验证头部。解决方法是在IIS设置中禁用基本身份验证。

在Fiddler的WebView中,发现了一个熟悉的图片,点击链接IIS错误页面。然后,在这个主题中找到了解决方案。解决方案是在IIS设置中禁用基本身份验证。访问令牌请求中带有基本身份验证头部,而IIS似乎拦截了它。不过,为什么流程的其他部分仍然可以正常工作还有一些不太清楚的地方。

0