gpt4 book ai didi

c# - Blazor JWT 身份验证

转载 作者:行者123 更新时间:2023-12-04 14:13:34 33 4
gpt4 key购买 nike

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

所以现在我正试图找出每个组件的正确角色。
首先,我们有 AuthenticationStateProvider,据我所知,这个组件有责任从服务器获取 JWT token ,或者如果一个存储在本地,它还可以在需要时处理 token 刷新?

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

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

谢谢。

最佳答案

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

Things fall apart for me when i am trying to deal with IAccessTokenProvider,



难怪...... IAccessTokenProvider 在这里不相关。 IAccessTokenProvider 是用于 WebAssembly Blazor 应用程序的新 JWT token 身份验证系统中的 token 提供程序。但是,如果您想自己实现 JWT 身份验证,则必须按照前三段中的描述进行操作……我可以这样总结:
  • 当用户首次访问 protected web api 端点并且他没有经过身份验证(或注册)时,他会被重定向到相关页面,键入他的凭据等,您将这些凭据传递给专门用于验证用户身份的 Web Api 端点(必要时注册等),之后调用的操作方法生成 JWT token ,并将其发送回浏览器上运行的 WebAssembly Blazor 应用程序。您应该存储 JWT token (可能在本地存储中),并在执行 HTTP 调用时检索它(将 JWT token 添加到请求的 header )。

  • 上述过程还涉及到 AuthenticationStateProvider 对象的实现,该对象随着认证状态更新,并通知订阅者,例如 CascadingAuthenticationState,认证状态已经改变,在该过程结束时其他组件和对象适应自己新情况......你知道,重新渲染等。

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

    What about automatic Token injection in headers of HTTP client, can i or should i still investigate custom AuthorizationMessageHandler or this component would not be usable without IAccessTokenProvider?



    您可以将 Jwt token 添加到每个 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));
    }
    }

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

    The last things that bothers me is the implementation of obtaining access token and storing it locally.The best approach i can think of so far is to have a global authentication service, this service will provide the functionality of obtaining the token, refreshing it, storing etc. Both IAccessTokenProvider and AuthenticationStateProvider will use it when token is requested plus will be notified whenever authentication state changes like user logs in or out.



    完美... 注意: AuthenticationStateProvider 应该被通知 Jwt Token 状态的变化。例如,当您从 Web Api 端点获取新 token 时,您的代码应将其添加到本地存储,然后将更改通知 CUSTOM AuthenticationStateProvider。如果您删除 Jwt token ,您的代码还应通知 AuthenticationStateProvider,以便您的用户界面反射(reflect)此更改等。

    祝你好运。

    希望这可以帮助...

    关于c# - Blazor JWT 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62405222/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com