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 令牌身份验证示例。
我正在尝试创建一个 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 令牌身份验证示例。