Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Blazor JWT身份验证_C#_Blazor - Fatal编程技术网

C# Blazor JWT身份验证

C# Blazor JWT身份验证,c#,blazor,C#,Blazor,我正试图找出用Blazor(WASM)实现JWT身份验证的正确方法。 看完文档后,a对内置组件的工作原理有了一个想法,但我仍然不清楚整个情况。 因此,在我的场景中,我将使用一个API服务器,API服务器可以发布JWT令牌,它们可以用于在需要时对端点进行身份验证 因此,现在我正试图找出每个组件的正确角色。 首先,我们有AuthenticationStateProvider,据我所知,该组件负责从服务器或本地存储的JWT令牌获取JWT令牌,还可以在需要时处理令牌刷新 现在,由于我将使用类型化HTTP

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

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

现在,由于我将使用类型化HTTP客户机,我将使用IHttpClientFactory,同时我将使用AuthorizationMessageHandler将令牌附加到所需的HTTP客户机实例

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


谢谢。

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

当我试图与Iaccess供应商打交道时,事情就变得支离破碎了

难怪。。。IAccessTokenProvider与此无关。IAccessTokenProvider是用于WebAssembly Blazor应用程序的新JWT令牌身份验证系统中的令牌提供程序。但是,如果您想自己实现JWT身份验证,您必须按照前面三段中描述的那样来实现。。。我可以这样总结:

  • 当用户首次访问受保护的web api端点时,如果他没有经过身份验证(或注册),他将被重定向到相关页面,键入他的凭据等,然后将其传递到专门用于验证用户身份的web api端点(如有必要,请注册等),之后调用的操作方法将生成JWT令牌,并将其发送回浏览器上运行的WebAssembly Blazor应用程序。您应该存储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));
    }
}
@code{
客户[]客户;
受保护的重写异步任务OnInitializedAsync()
{
//从本地存储器读取令牌
var token=await TokenProvider.GetTokenAsync();
客户=等待Http.GetFromJsonAsync(
“api/客户”,
新的AuthenticationHeaderValue(“承载者”,令牌));
}
}
这很好。但当然,您可以创建一个定制的DelegatingHandler,该Handler以AuthorizationMessageHandler为模型,或者更好地创建BaseAddressAuthorizationMessageHandler,因为您将使用IHttpClientFactory来提供HttpClient服务。首先尝试在不做任何修改的情况下使用它们,如果不实用,就模拟它们的功能

最后困扰我的是获取访问令牌并将其存储在本地的实现。到目前为止,我能想到的最佳方法是使用全局身份验证服务,该服务将提供获取令牌、刷新令牌、,存储等。当请求令牌时,IAccessTokenProvider和AuthenticationStateProvider都将使用它,并且无论何时身份验证状态发生变化(如用户登录或注销),都会通知它

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

祝你好运


希望这有助于

非常感谢你的意见。因此,对于基于配置的start,我可以忽略IAccessTokenProvider。关于HTTP客户端头中的自动令牌注入,我是否可以或应该继续调查自定义AuthorizationMessageHandler,或者如果没有IAccessTokenProvider,该组件将无法使用?我想我将坚持使用BaseAddressAuthorizationMessageHandler加上自定义IAccessTokenProvider,因为它们之间的关系现在更清楚了。最后一件困扰我的事情是获取访问令牌并将其存储在本地的实现