【问题标题】:OpenIDConnect in Blazor WebAssembly with an IdentityServer4 + ASP.NET Core Identity postgresql database without redirectBlazor WebAssembly 中的 OpenIDConnect,带有 IdentityServer4 + ASP.NET Core Identity postgresql 数据库,无需重定向
【发布时间】:2021-01-27 22:54:40
【问题描述】:

我正在尝试创建一个 IdentityServer4 + ASP.NET Core Identity 后端来处理访问/刷新令牌和用户/登录管理。在某个时间点,我还将创建一个 Web API,因此我需要访问令牌。我的前端是 Blazor WebAssembly。

在我阅读的几乎所有指南/教程中,我都提到了使用 Open ID Connect 的授权代码授予。但是,当我实现这一点时,我会从用户登录页面重定向到不同端口上的身份服务器登录页面,如下所示:

services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
        .AddCookie("Cookies")
        .AddOpenIdConnect("oidc", options =>
        {
            options.SignInScheme = "Cookies";

            options.Authority = "https://localhost:5000";
            options.RequireHttpsMetadata = false;

            options.ClientId = "mvc";
            options.SaveTokens = true;
        });

在此示例中,我的身份服务器在 localhost:5000 上运行,而我的 blazor wasm 在 localhost:5003 上运行。我希望用户能够在同一域上使用 Blazor Webassembly 的前端 UI 登录,我该怎么做?

【问题讨论】:

  • 这就是它的工作方式,IDP 在不同的站点上。如果您不介意有一个专用的 IDP,您可以随时在 blazor 中使用 Identity。
  • 我有点厚...你的意思是要在 WebAssembly 应用程序中创建一个登录表单,其中一些代码可以对用户进行身份验证,内部将 id-token 传递给 Blazor,等等。换句话说,您不希望 Blazor 将用户重定向到 IdentityServer 提供程序进行身份验证。您不想看到 IdentityServer4 提供的登录页面,但您想要一个为您量身定制的页面。
  • @enet 是的,这正是我想要的。我知道我也可以编辑登录页面以查看我想要的方式,但我不想为此离开 blazor wasm 的域。

标签: asp.net-core redirect identityserver4 blazor identity


【解决方案1】:

@enet 是的,这正是我想要的。我知道我也可以编辑登录页面以查看我想要的方式,但我不想为此离开 blazor wasm 的域

您实际上希望避免重定向到 IdentityServer4 服务器,但是,重定向是 OpenID Connect 流程的核心......

我只能想到一个 Blazor 团队创建当前 WebAssembly 认证系统之前常见的解决方案:使用 JWT Token Authentication...

执行以下操作:

  • 创建一个 WebAssembly 托管的应用程序。
  • 创建登录页面、注册页面等

使用 WebAssembly 托管的应用程序,前端(浏览器)和后端(服务器)属于同一个域。您可以将帐户控制器添加到具有登录端点的 Controllers 文件夹中,该端点将使用 HTTP 调用从前端访问,并使用您的登录页面收集的用户凭据。登录端点中的代码应该对用户进行身份验证,可能使用身份系统(默认),然后创建一个传递给前端的 JWT 令牌 (可以存储在本地存储中)。现在,每当您想要访问受保护的 Web api 端点时,您都​​可以将 JWT 令牌添加到 HttpClient 对象的标头中。

注意:我不建议采用它,因为它需要时间和知识。当然是可行的,我们以前就是这样写代码的。

我没有太多时间详细而有序地回答您的问题,所以如果您有任何问题,请不要犹豫。

感谢您的回复!也许我只是不明白...如果我想登录到任何其他站点,我永远不会重定向到其他域进行登录。这是否意味着所有这些网站都不使用 OIDC?

如果你说的是对的,那么答案是肯定的。 OpenID Connect 的流程需要重定向。您不能也不应该在客户端(浏览器)上对用户进行身份验证。例如,如果您使用 OpenID Connect,您可以将他重定向到像 IdnetityServer4 这样的身份提供者,或者执行 HTTP 调用以将用户的凭据发送到 Web Api 端点进行身份验证,并返回 JWT 令牌。还有其他验证用户的方法,这些方法都没有发生在前端。由于您想要您的 Web 应用程序以及为该应用程序提供服务并包含 Web Api 端点的服务器,因此您应该考虑我上面的建议。请注意,这是一个可行的解决方案,我并不是真的要阻止您采用它;关键是 Blazor 为您提供了令人惊叹的功能,经过充分测试和保护,这主要需要您配置一些设置等,而自行实施它需要一些知识和时间。但当然你可以找到 Blazor 的 JWT Token 身份验证示例。

【讨论】:

  • 感谢您的回复!也许我只是不明白...如果我想登录到任何其他站点,我永远不会重定向到其他域进行登录。这是否意味着所有这些网站都不使用 OIDC?我没看到什么?
  • 如果你打算使用 JWT 令牌认证,我可以在这里发布一些代码示例如何做到这一点。您也可以访问 Chris Sainty 的网站,在那里您可以找到完整的示例...
  • 非常感谢@enet 的精心回复。现在我要接受我需要使用重定向的事实。将来我可能会考虑创建自定义 JWT 令牌。我想我也找到了您所指的示例。
猜你喜欢
  • 2021-09-08
  • 2020-09-14
  • 2019-01-12
  • 2021-01-19
  • 2017-04-20
  • 2021-04-11
  • 2023-03-17
  • 2019-07-19
  • 2019-05-01
相关资源
最近更新 更多