集成身份服务器; Docker和MVC Core(Web客户端)

时间:2018-11-25 13:42:52

标签: c# asp.net-mvc docker identityserver4

我正在尝试使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。但是,到目前为止,答案仍无济于事。

3 个答案:

答案 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)

我可能会迟到一点,但我希望这可以帮助遇到类似问题的人。

一些注意事项:

  • 这不是Identity Server本身的问题,而是容器看到的内部Docker URL(http://identityserverwithaspnetidentity)和浏览器看到的本地主机URL(http://localhost:5000)之间的不匹配。 / li>
  • 您应继续使用Identity Server的本地URL(http://localhost:5000),并添加一个特殊情况以处理容器与容器之间的通信。
  • 以下修补程序仅在使用Docker(Docker Compose,Kubernetes)进行开发时是 ,因此,理想情况下,您应检查环境(IsDevelopment扩展方法),以使代码不是用于生产中。

IdentityServer配置

if (Environment.IsDevelopment())
{
    // It is not advisable to override this in production
    options.IssuerUri = "http://localhost:5000";
}

MVC客户端


// 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微服务体系结构的一个非常有用的资源。