当前位置: 首页 > 面试题库 >

Identity Server 4和Docker

岳志义
2023-03-14
问题内容

我正在尝试使用docker配置IdentityServer4,但无法使其工作。首先,我以身份服务器文档的Client
Credential为例:使用Client
Credentials保护API

IdentityServer
托管在端口5000上

WebApi
托管在端口5001上

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

 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”,这也很有意义,但我不知道是否可以更改授权机构名称?我也尝试IssuerUri在IdentityServer项目中设置,但没有帮助


问题答案:

网络

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

C1运行身份验证容器。

C2运行WebApi容器。

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

要实现此目标,可能会遇到很多网络问题。例如:什么会阻止在Docker容器中运行的代码连接到单独服务器上的数据库?

发行人验证

发行人验证失败

您的客户的授权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价值。这是一个简单的相等比较:

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

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

DiscoveryClient.Policy.ValidateIssuerName = false;

仅供参考,IssuerUri设置,不建议用于生产环境:

IssuerUri设置将出现在发现文档中的发行者名称和已发行的JWT令牌。建议不要设置此属性,该属性从客户端使用的主机名推断发行者名称。



 类似资料:
  • IdentityServer4 .Net平台下的OAuth2组件,github上的关注度不低于DotNetOpenAuth。 概述: IdentityServer4 是一个基于 .NET/Katana 的框架,它可实现单点登录和访问 modern web 服务器,且其 APIs 可以使用类似于 OpenID Connect 和 OAuth2 协议。它像 mobile, web, SPAs 和桌面应

  • IdentityServer4 是为ASP.NET Core 2.系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证框架。 将 identityserver 部署在你的应用中,具备如下的特点 认证服务 可以为你的应用(如网站、本地应用、移动端、服务)做集中式的登录逻辑和工作流控制。IdentityServer是完全实现了OpenID Connect协议标准。 单点登

  • 我使用Azure AD作为具有IdentityServer4的外部IdP。要调用受AzureAd保护的API,我需要从Azure Ad获取访问令牌。是否可以在登录过程中获取访问令牌并将其保存到声明中? 我正在使用IdentityServer4快速启动UI。我试图在外部令牌的回调方法中捕获访问令牌,但在HttpContext或声明或ProcessLoginCallbackForOidc方法中没有找到

  • 一个解决方案是在与我的MVC客户机相同的进程中托管IdentityServer4,但这是不鼓励的。 是否有本地用户注册IdentityServer4的好的实际例子?

  • 问题内容: 我正在使用IdentityServer4和来自ASP.NET Core 3.0的React启动项目。预览4,它可以完美工作,直到构建解决方案并尝试使用dotnet命令从cmd提示符运行它为止。每次我启动应用程序时,它都会告诉我未指定密钥类型。 我没有尝试过各种有关生成证书的指南,因为我对.NET没有任何经验。我提到这一点是为了防止问题可能是由于生成证书的方式不正确引起的。 我也尝试过将

  • 嗨, 我创建了identityServer4来保护我们的API。我们希望允许我们的一个客户端在不发送scope参数的情况下进行连接。 目前,他可以通过发送查询参数登录,如下所示:https://IP/connect/authorize?response_type=token 如果他发送的请求没有作用域,服务器将抛出无效作用域错误。 以下是客户的声明

  • 我使用IdentityServer4验证angular 4客户端以保护WebApi。但我在授权的情况下进入了401。我需要一种调试访问令牌验证过程的方法来帮助我解决问题。

  • 我用IdentityServer4创建了一个令牌我复制了这个例子我只是修改了这个 在身份服务器中- 我的令牌应该在10秒后到期,并且每10秒我有一个刷新令牌,但我不知道如何测试它。我做类似的事情: 它退回已过期的商品,我认为它应该退回我未过期的商品,因为它会被刷新。