IdentityServer 4,OpenIdConnect重定向到外部登录 URL

20

我正在尝试构建多个小型的ASP.NET Core Mvc服务,这些服务连接到使用IdentityServer4构建的身份验证服务器。

我已经在MVC服务上设置了类似于以下内容的OpenIdOption:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationScheme = "Cookies"
});

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
    AuthenticationScheme = "oidc",
    SignInScheme = "Cookies",

    Authority = "http://localhost:5000",
    RequireHttpsMetadata = false,

    ClientId = "mvc",
    ClientSecret = "secret",

    ResponseType = "code id_token",
    Scope = { "api1", "offline_access" },

    GetClaimsFromUserInfoEndpoint = true,
    SaveTokens = true
});

我的Identity服务器运行在http://localhost:5000端点上。假设我的MVC服务器在http://localhost:5002,那么当我将[Authorize]属性设置为控制器时,它会重定向到我的Identity服务器,如果检查失败,则会在http://localhost:5002/signin-oidc寻找登录页面。

现在我的问题是,我希望登录页由我的Identity服务器托管,托管在http://localhost:5000/signin-oidc,以便所有MVC服务都可以使用它来获取用户身份,但不幸的是我无法看到如何设置这个RedirectUrl

enter image description here

我知道图表的工作流程不准确,只是试图简化我想要完成的内容 :)

这是否可能实现?

问候 Kiran

1个回答

86
你好像误解了 /signin-oidc 路由的作用。一般情况下,流程如下:
  1. 用户访问 ASP.NET Core 网站。
  2. 应用程序请求默认身份验证方案 "Cookies" 进行身份验证。
    1. Cookie 身份验证处理程序尝试从(签名的)Cookie 信息中还原标识。
    2. 因为缺少 Cookie 而导致 Cookie 身份验证失败。
  3. 应用程序请求默认挑战方案 "oidc" 执行身份验证挑战。
    1. OpenIdConnect 身份验证处理程序重定向到 OpenId Connect 身份验证提供程序,这就是您的 Identity Server。
    2. 用户在 Identity Server 上成功登录。
    3. 用户被 POST 到 /signin-oidc,这是 OpenId Connect 身份验证处理程序的远程登录地址。
    4. OpenId Connect 身份验证中间件处理 /signin-oidc 路由,并从 Identity Server 发出的登录请求中检索用户信息。
    5. OpenId Connect 身份验证方案创建身份验证票据,并要求已配置的登录方案对用户进行登录。
  4. Cookie 身份验证方案处理登录过程并创建用户标识。它将标识存储在 Cookie 中,以便在未来的请求中检索,而无需再次经过整个身份验证挑战管道。
  5. 用户已登录。
因此,/signin-oidc 终点是返回到您的应用程序以完成 OpenId Connect 身份验证流程的方式。当用户到达此地址时,他们已经在 Identity Server 上登录,并被重定向回应用程序以继续他们最初离开的位置。通常,用户在该路由上花费的时间很短,因为一旦登录请求已被处理,它就会立即重定向回“适当”的应用程序路由。

因此,这里不会有登录表单。登录过程本身是您的OpenId Connect身份验证提供者,即您的Identity Server的责任。这就是整个意义所在,因此您可以使用Google凭据在google.com上安全登录,而不是在my-random-and-probably-untrusted-app.example.com上登录,该网站绝对不应获取您的实际Google凭据。


谢谢!这真的救了我的一天。我对Identity服务器客户端属性中的“RedirectUris”感到困惑。当这不正确时,我看不到登录页面,所以我认为这是一个回调。 - Kiran
我该如何处理 .NET Core 应用程序具有外部 FQDN 和内部 FQDN 的情况?signin-oidc 尝试调用两者,这在我们的应用程序中造成了问题。 - Josh Monreal
@JoshMonreal 您说的"attempts to call both"是什么意思?通常,在OIDC受到挑战时,它会重定向到身份提供者(IdP),使用相对于最初请求来源构建的重定向URL。因此,如果您进入https://myapp.com,则重定向URL应为https://myapp.com/signin-oidc; 当您通过https://myapp.local访问应用程序时,则重定向URL应为https://myapp.local/signin-oidc。因此,应用程序本身(按设计)完全不知道它是如何被托管的。 - poke
我们的Web应用程序部署在Azure App Service上,该URL无法从公共互联网访问。我们称其为https://internallink.company.com。为了使最终用户能够在公司网络之外访问此Web应用程序,我们为其创建了一个外部FQDN(别名),例如https://externallink.company.com。现在,当我使用OIDC运行Web应用程序时,它会检查这两个链接:https://internallink.com/signin-oidc和https://externallink.com/signin-oidc。这就是我的问题所在,因为它不应该调用内部链接。 - Josh Monreal
@JoshMonreal 当你说“它检查两个链接”时,你具体是什么意思呢?因为应用程序本身并不会打开它们。这是用户在通过例如 AAD 登录后应被发送到的位置。这就是这个问题所涉及到的内容吗?那么我会去那里查看并回复。 - poke
是的,就是那个问题。它更好地解释了这个问题。谢谢你的帮助。 - Josh Monreal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接