Blazor JWT身份验证

空参考

我试图找出使用Blazor(WASM)实现JWT身份验证的正确方法。在阅读了文档之后,我对内置组件的工作原理有了一个想法,但是整个画面仍然不清楚。因此,在我的场景中,我有一个将要使用的API服务器,API服务器可以发出JWT令牌,并且可以根据需要使用它们对端点进行身份验证。

因此,现在我正在尝试找出每个组件的正确角色。首先,我们有AuthenticationStateProvider,据我所知,此组件负责从服务器或从本地存储的JWT令牌中获取JWT令牌,还可以在需要时处理令牌刷新吗?

现在,由于我将使用类型HTTP客户端,因此我将使用IHttpClientFactory,并且我还将使用AuthorizationMessageHandler将令牌附加到所需的HTTP客户端实例。

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

谢谢。

互联网

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

当我尝试处理IAccessTokenProvider时,事情对我来说是崩溃的,

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

  • 当用户首次访问受保护的Web api端点并且未通过身份验证(或注册)时,他将被重定向到相关页面,键入其凭据等,您将其传递到专用于对用户进行身份验证的Web Api端点(必要时进行注册等),然后调用的操作方法产生JWT令牌,并将其发送回在浏览器上运行的WebAssembly Blazor App。您应该存储JWT令牌(也许在本地存储中),并在执行HTTP调用时将其检索(将JWT令牌添加到请求的标头中)。

上述过程还涉及AuthenticationStateProvider对象的实现,该对象将随身份验证状态更新,并通知订户(例如CascadingAuthenticationState)身份验证状态已更改,在此过程结束时,其他组件和对象将使自己适应新情况...您知道,重新渲染等等。

因此,您看到的是,您已经从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都将使用它,并且只要身份验证状态发生变化(例如用户登录或注销),就会被通知。

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

祝好运。

希望这可以帮助...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Jwt身份验证在Blazor Serverside中不起作用

使用Jwt令牌身份验证在Blazor Server App中自定义AuthenticationStateProvider

使用Blazor 0.9.0和ASP.NET Core 3的JWT身份验证预览4

Blazor Webassembly身份验证事件

Blazor ServerApp。Windows身份验证?

Blazor-Windows身份验证

如何在没有Microsoft身份的情况下进行JWT身份验证blazor服务器?

使用 Blazor 服务器和 Azure AD 身份验证获取身份验证令牌

Blazor AD身份验证安全句柄已关闭

在 Blazor 中获取访问令牌的 Google 身份验证错误

Blazor 使用 Azure AD 身份验证允许匿名访问

Blazor 身份验证项目中的自定义 UI

如何在Blazor WebAssembly中实现OIDC身份验证?

Blazor 服务器:针对 Identity Server 4 进行身份验证并使用 cookie 进行本地身份验证

如何通过组织身份验证从Blazor Server中的身份获取用户属性

如何在Blazor WASM中为多个身份提供者实现外部身份验证?

Blazor Server .Net Core身份验证链接到其他数据库表

在Blazor中的视图之外访问经过身份验证的用户

服务器端Blazor获得身份验证到期

多个Blazor Server应用程序和Azure身份验证注销问题

从Blazor应用程序中的Middleware类获取经过身份验证的用户

通知所有组件Blazor中的身份验证已更改

Blazor WebAssembly中使用数据库优先方法进行身份验证和授权

Blazor安全性-Razor Pages自定义身份验证/安全性

Blazor身份验证-Http呼叫确实适用于匿名用户

如何在 Blazor B2C 应用程序启动期间禁用身份验证?

未注册具有身份验证AuthenticationStateProvider的Blazor Wasm托管预呈现器

如何从Blazor中的数据库获取经过身份验证的用户

如何使用Blazor服务器对用户进行身份验证