Blazor WebAssembly 中的 OpenIDConnect 带有 IdentityServer4 + ASP.NET Core Identity postgresql 数据库,无需重定向

OpenIDConnect in Blazor WebAssembly with an IdentityServer4 + ASP.NET Core Identity postgresql database without redirect

我正在尝试创建一个 IdentityServer4 + ASP.NET Core Identity 后端来处理 access/refresh 令牌和 user/signin 管理。在某个时间点,我还将创建一个网络 API,因此我需要访问令牌。我的前端是 Blazor WebAssembly。

在我阅读的几乎每本 guide/tutorial 中,我都被指向使用 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 在 localhost:5003 上运行。我希望用户能够使用来自同一域的 Blazor Webassembly 的前端 UI 登录,我该怎么做?

@enet yes, that is exactly what I would like. I know I can edit the login page to look how I want it too, but I dont want to have to leave the domain of the blazor wasm for that to do it

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

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

执行以下操作:

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

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

注意:考虑到它需要的时间和知识,我不建议采用它。当然是可行的,我们以前也是这样打码的

我没有太多时间来详细和有序地回答你的问题,所以如果你有问题,请不要犹豫。

Thank you for your response! Maybe I just dont get it then... If I want login to any other site I am never redirected to some other domain to login. Does that mean all those sites dont use OIDC?

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