繁体   English   中英

Blazor JWT 认证

[英]Blazor JWT Authentication

我正在尝试找出使用 Blazor (WASM) 实现 JWT 身份验证的正确方法。 在浏览了文档之后,我了解了内置组件的工作原理,但我仍然不清楚整个情况。 所以在我的场景中,我有一个 API 服务器将被使用,API 服务器可以发出 JWT 令牌,它们可用于在需要时对端点进行身份验证。

所以现在我正试图找出每个组件的正确角色。 首先,我们有 AuthenticationStateProvider,据我了解,该组件负责从服务器或本地存储的令牌获取 JWT 令牌,它是否也可以在需要时处理令牌刷新?

现在,由于我将使用 Typed HTTP 客户端,因此我将使用 IHttpClientFactory,同时我将使用 AuthorizationMessageHandler 将令牌附加到所需的 HTTP 客户端实例。

当我尝试处理 IAccessTokenProvider 时,事情对我来说分崩离析,因为我知道一旦创建 HTTP 客户端并且即将发出 http 请求,就会调用默认实现。 不清楚的是这个 IAccessTokenProvider 将如何获取令牌。 所以问题是我是否应该创建自己的 IAccessTokenProvider 实现,如果是,它应该如何处理令牌。 正如我所说,我不会使用任何内置的身份验证提供程序,而是将拥有自己的 JWT 身份验证系统。

谢谢。

前三段非常清楚和正确。 这就是你应该这样做的方式。 我可以在这里发布一些代码片段来演示它是如何在实践中完成的......

当我尝试处理 IAccessTokenProvider 时,事情就崩溃了,

难怪...... IAccessTokenProvider 在这里不相关。 IAccessTokenProvider 是用于 WebAssembly Blazor 应用程序的新 JWT 令牌认证系统中的令牌提供程序。 但是,如果您想自己实现 JWT 身份验证,则必须按照前三段中的描述进行操作……我可以这样总结:

  • When a user makes a first access to a protected web api endpoint and he's not authenticated (or registered), he's redirected to the relevant pages, type his credentials, etc, which you pass to your Web Api end point dedicated to authenticate the user (必要时注册等),然后调用的操作方法生成 JWT 令牌,并将其发送回浏览器上运行的 WebAssembly Blazor 应用程序。 您应该存储 JWT 令牌(可能在本地存储中),并在执行 HTTP 调用时检索它(将 JWT 令牌添加到请求的标头中)

上述过程还涉及到 AuthenticationStateProvider object 的实现,它更新为身份验证 state,并通知订阅者,如 CascadingAuthenticationState,身份验证 Z9ED39E2EA931586B3A985A6942EF5 已更改,以适应进程的末尾。新情况……你知道,重新渲染等等。

所以,你看,你从你的 Web Api 收到了一个 JWT 令牌,将其存储在本地存储中,读取并使用它。 在很大程度上,从本地存储读取 Jwt 令牌并解析它是 IAccessTokenProvider 所做的事情,但在新的身份验证系统中,由于您不使用此系统,因此 IAccessTokenProvider 不相关。

HTTP 客户端的标头中的自动令牌注入怎么样,我是否可以或应该仍然调查自定义 AuthorizationMessageHandler,否则如果没有 IAccessTokenProvider,此组件将无法使用?

您可以将您的 Jwt 令牌添加到每个 HTTP 调用中,如下所示:

    @code {
    Customer[] customers;

    protected override async Task OnInitializedAsync()
    {
        // Read the token from the local storage
        var token = await TokenProvider.GetTokenAsync();
        customers = await Http.GetFromJsonAsync<Customer[]>(
            "api/customers",
            new AuthenticationHeaderValue("Bearer", token));
    }
}

这很好。 但是,当然,您可以创建一个仿照 AuthorizationMessageHandler 的自定义 DelegatingHandler,或者更好的是 BaseAddressAuthorizationMessageHandler,因为您将使用 IHttpClientFactory 来提供您的 HttpClient 服务。 首先尝试尝试在不进行任何修改的情况下使用它们,如果不实用,只需模拟它们的功能。

困扰我的最后一件事是获取访问令牌并将其存储在本地的实现。到目前为止我能想到的最好的方法是拥有一个全局身份验证服务,该服务将提供获取令牌的功能,刷新它,存储等等。 IAccessTokenProvider 和 AuthenticationStateProvider 都将在请求令牌时使用它,并且每当身份验证 state 更改(如用户登录或注销)时都会收到通知。

完美... 注意:应通知 AuthenticationStateProvider Jwt 令牌的状态更改。 例如,当您从 Web Api 端点获得新令牌时,您的代码应将其添加到本地存储,然后将更改通知 CUSTOM AuthenticationStateProvider。 如果您删除 Jwt 令牌,您的代码还应通知 AuthenticationStateProvider,以便您的用户界面反映此更改等。

祝你好运。

希望这可以帮助...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM