我正在尝试使MVC Core Web应用程序与Identity Server和Docker一起使用。这是我已采取的步骤:
1)下载快速入门:https://github.com/IdentityServer/IdentityServer4.Samples/tree/dev
运行该项目,并看到它按预期工作。现在尝试将Docker添加到公式中:
2)打开解决方案。右键单击:IdentityServerWithAspNetIdentity并选择:添加容器编排支持(然后是Docker Compose,然后是Linux)。 3)右键单击MVCClient,然后选择:添加容器编排支持(然后是Docker Compose,然后是Linux)。 4)将Docker-compose.override.yml更改为此(请注意,我仅将每个服务的端口从80更改为5002:80和5000:80):
version: '3.4'
services:
mvcclient:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "5002:80"
identityserverwithaspnetidentity:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "5000:80"
5)尝试运行项目以查看会发生什么。当我尝试访问时:主页/安全;而不是转发到登录网页;我看到此错误:'Unable to obtain configuration from:http://localhost:5000/.well-known/openid-configuration'.
我相信这是因为Docker容器无法看到localhost:5000。因此,在阅读了几篇博客文章之后;我试试这个:
6)在MVCClient中打开启动并更改它:
options.Authority = "http://localhost:5000";
对此:
options.Authority = "http://identityserverwithaspnetidentity:80";
但是,我只看到一个DNS错误(我相信是404)。在这种情况下,我需要做什么才能使Identity Server与MVC Web应用程序一起使用?
到目前为止,我已经在这里:How can I use IdentityServer4 from inside and outside a docker machine?和这里:Identity Server 4 and docker。但是,到目前为止,答案仍无济于事。
答案 0 :(得分:1)
您已经在我的thread上注意到了类似的问题。我所做的是在IdentityServerAuthenticationOptions
(API端)上配置以下内容:
1)设置正确的Autority
,在您的情况下,我说应该是http://identityserverwithaspnetidentity/
2)配置ApiName
(这是ApiResource的名称)
3)也许还配置JwtBackChannelHandler
(不确定是否需要)
4)如果您不使用Https,我将停用它(我不记得是否明确需要这样做:将RequireHttpsMetadata
设置为false)
然后在客户端上我进行了跟踪
1)将ValidateIssuerName
设置为false
2)如果您不使用Https,也可以通过将RequireHttps
设置为false来停用它(我不记得是否明确需要这样做)
答案 1 :(得分:1)
我可能会迟到一点,但我希望这可以帮助遇到类似问题的人。
一些注意事项:
http://identityserverwithaspnetidentity
)和浏览器看到的本地主机URL(http://localhost:5000
)之间的不匹配。 / li>
http://localhost:5000
),并添加一个特殊情况以处理容器与容器之间的通信。IsDevelopment
扩展方法),以使代码不是用于生产中。if (Environment.IsDevelopment())
{
// It is not advisable to override this in production
options.IssuerUri = "http://localhost:5000";
}
// It is important this matches the actual URL of your identity server, not the Docker internal URL
options.Authority = "http://localhost:5000";
if (Environment.IsDevelopment())
{
// This will allow the container to reach the discovery endpoint
options.MetadataAddress = "http://identityserverwithaspnetidentity/.well-known/openid-configuration";
options.RequireHttpsMetadata = false;
options.Events.OnRedirectToIdentityProvider = context =>
{
// Intercept the redirection so the browser navigates to the right URL in your host
context.ProtocolMessage.IssuerAddress = "http://localhost:5000/connect/authorize";
return Task.CompletedTask;
};
}
您可以通过配置传递上述网址来对代码进行一些调整。
答案 2 :(得分:0)
最近几天,我一直在同一个问题上苦苦挣扎,终于找到了可行的解决方案!您所需要做的就是将Authority(在您的mvc客户端中)和IssuerUri(在您的身份API中)设置为Docker主机的IP地址。在Windows上是10.0.75.1。
在回顾eShopOnContainers中的实现之后,我终于能够想到这一点,我发现它是学习如何在.NET Core中实现dockerized微服务体系结构的一个非常有用的资源。