首页 > 解决方案 > Blazor 服务器、带有 OpenIdDict 的 API 和使用自省 - 如何处理访问令牌?

问题描述

我有一个 API,它也托管一个 OpenIdDict 令牌端点。API 没有任何带有登录表单的网页,而是在响应中返回访问令牌作为接收表单帖子的结果。

我以前有一个旧的 AngularJS 前端,它与 API 对话以获取令牌并将其存储在客户端上。Angular 负责将令牌添加到服务器的每个请求中。

我现在正计划使用 Blazor Server 重建前端。我希望新的 Blazor Server 客户端/前端对 API 令牌端点使用自省。

我的计划是构建一个自定义登录页面,该页面将在服务器端与 API 对话并获取访问令牌、刷新令牌等。但我不知道之后将访问令牌放在哪里以便它使用每当我使用 Authorize 属性时,都会通过自省 Blazor。我可以只返回令牌并编写一些 javascript 将其保存在某处并将其添加到任何后续 http 请求中,但这不像 Blazor Server 解决方案?

我的最新发现是令牌可以“在会话中”存储在服务器上,并在客户端上创建“会话标识符”cookie?可能完全不在这...

当我在 Blazor Server 中使用身份支持时,总是在成功登录后创建一个名为“.AspNetCore.Identity.Application”的 cookie。

我一直在考虑的另一个不太理想的解决方案或解决方法是将 API 的 OpenIdDict-setup 代码复制到 Blazor Server 项目并将它们指向同一个数据库。

这里的任何帮助将不胜感激!

标签: asp.net-core.net-coreblazorblazor-server-sideopeniddict

解决方案


我的计划是构建一个自定义登录页面,该页面将在服务器端与 API 对话并获取访问令牌、刷新令牌等。但我不知道之后将访问令牌放在哪里以便它被使用每当我使用 Authorize 属性时,都会通过自省 Blazor。我可以只返回令牌并编写一些 javascript 将其保存在某处并将其添加到任何后续的 http 请求中,但这不像 Blazor Server 解决方案?

您可以将访问令牌存储在本地存储中,并在需要时检索其值。是的,它是 Blazor Server 解决方案。这就是你应该这样做的方式。

当我在 Blazor Server 中使用身份支持时,总是在成功登录后创建一个名为“.AspNetCore.Identity.Application”的 cookie。

这是真实的。这是一个声明还是你在这里问一个问题?无论如何,我猜这个 cookie 会在它的生命周期结束时被自动删除。但是在您的情况下,您必须手动进行;您必须编写代码来检查访问令牌是否已过期。如果您不这样做,您的应用程序将在您尝试访问 Wep Api 端点时出现问题。如果您不管理存储的访问令牌,Blazor 中的授权组件和对象也会错误执行,例如,嵌入在 LoginDisplay 组件中的 AuthorizeView 将显示经过身份验证的用户的名称(因为您从中提取的声明访问令牌构成 AuthenticationSateProvider 创建 AuthenticationState 对象的数据),但不检查访问令牌的有效性。

我在上面描述了一些应该用数百页的文字来解释的东西。希望你不会很困惑。

这是您开始调查的最佳地点使用 Jwt 令牌身份验证自定义 Blazor 服务器应用程序中的 AuthenticationStateProvider

希望这可以帮助...


推荐阅读