gpt4 book ai didi

c# - 身份服务器 4 和 docker

转载 作者:IT老高 更新时间:2023-10-28 21:20:20 27 4
gpt4 key购买 nike

我正在尝试使用 docker 配置 IdentityServer4,但无法使其正常工作。首先,我使用了身份服务器文档的客户端凭据示例:Protecting an API using Client Credentials

身份服务器
托管在端口 5000

WebApi
托管在端口 5001

在我的 WebApi 的 Startup.cs 文件的 Configure 方法中,我做了以下操作(问题可能就在这里):

 app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
Authority = "http://web:5000",
RequireHttpsMetadata = false,
ApiName = "api1"
});

客户
和客户

 // Everything is fine here...
var disco = await DiscoveryClient.GetAsync("http://localhost:5000");
var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api");

// This does not work
var client = new HttpClient();
client.SetBearerToken(tokenResponse.AccessToken);
var response = await client.GetAsync("http://localhost:5001/identity");

问题可能出在我的WebApi上:

1) 如果我将权限设置为 localhost:5000,我会收到内部服务器错误:“无法从以下位置获取配置:'http://localhost:5000/.well-known/openid-configuration'”这是有道理的,因为 localhost:5000 在此容器中是未知的

2) 如果我将权限设置为 http://web:5000我收到一个授权错误:“颁发者验证失败。颁发者:'http://localhost:5000'。不匹配:validationParameters.ValidIssuer:'http://web:5000'或validationParameters.ValidIssuers”这也是有道理的,但我不知道是否可能更改权限名称?我也尝试在 IdentityServer 项目中设置 IssuerUri 但没有帮助

最佳答案

网络

假设您有两台物理机:C1 和 C2。每台机器都是一个 docker 主机。

C1 运行 Auth 容器。

C2 运行 WebApi 容器。

当您在 Auth dockerfile 中公开端口 5000 时,地址 C1:5000 应该可以从 C2 从 WebApi 容器本身访问。你可能更喜欢IP而不是DNS,没关系。此外,您应该能够成功地向 http://C1:5000/.well-known/openid-configuration 发出 GET 请求。

要实现这一点,您可能会面临很多网络问题。例如: What would prevent code running in a Docker container from connecting to a database on a separate server?

发行人验证

Issuer validation failed

您客户的授权 URL 与 Auth 主机名不同。默认情况下,授权 URL 应等于 issuer 属性值(此属性在 Identity Server 自动发现文档响应中)。

issuer 属性值取决于您客户端的网络请求:

GET http://127.0.0.1:6000/.well-known/openid-configuration -> "issuer": "http://127.0.0.1:6000"
GET http://localhost:6000/.well-known/openid-configuration -> "issuer": "localhost:6000"

尝试将 IssuerUri 设置为开发环境的常量:

services.AddIdentityServer(x =>
{
x.IssuerUri = "foo";
})

实现一个常量issuer值。这允许通过任何有效的 URL(使用 IP、机器名或 DNS)调用 Identity Server:

GET http://anything/.well-known/openid-configuration -> "issuer": "foo"

DiscoveryClient 还验证 issuer 值。这是一个简单的等式comparison :

public bool ValidateIssuerName(string issuer, string authority)
{
return string.Equals(issuer, authority, StringComparison.Ordinal);
}

您可以通过以下方式禁用它:

DiscoveryClient.Policy.ValidateIssuerName = false;

仅供引用,IssuerUri 设置 is not recommended对于生产环境:

IssuerUri Set the issuer name that will appear in the discoverydocument and the issued JWT tokens. It is recommended to not set thisproperty, which infers the issuer name from the host name that is usedby the clients.

关于c# - 身份服务器 4 和 docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44481538/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com