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

时间:2020-01-26 20:10:54

标签: authentication cookies jwt blazor blazor-server-side

我正在使用blazor服务器(不使用webapi,httpclient和...) 我想使用jwt进行身份验证

  1. 我应该在哪里存储令牌? localStorage还是cookie?
  2. 如何将jwt发送到服务器的所有请求?
  3. 我必须使用AuthenticationStateProvider吗?

    我使用了httpContext,但除非将其放入cshtml中,否则我得到一个错误 我也在AuthenticationStateProvider内部使用了localstorage文件,但是 只是有一个错误

    还,哪个更好? blazor服务器(一个项目)或 带有webapi的blazor服务器?(两个项目,blazor服务器和api)

1 个答案:

答案 0 :(得分:3)

哪个更好? blazor服务器(一个项目)或带有webapi的blazor服务器?(两个项目,blazor服务器和api)

没有这样的东西更好。这完全取决于您的要求。您是否需要或希望使用Wep Api?如果您不打算使用Web Api,请不要使用Jwt身份验证。要访问A Web Api端点时,将使用Jwt访问令牌。您可以改用Identity UI系统来验证用户。您可能很熟悉,并且可以在一段时间内完成设置和运行。

我应该在哪里存储令牌? localStorage还是cookie?

You may use the JavaScript local storage to store and retrieve Jwt tokens.

如何将jwt发送到服务器的所有请求

您的意思是服务器Wep Api端点,对吗?

  1. 从本地存储中检索Jwt令牌(只要您的应用具有 已经验证了用户身份,并将令牌存储在本地存储中) 例如:

    @code {
    
     List<Hotel> hotels;
    
     protected override async Task OnInitializedAsync()
     {
        // Read the token from the store
        var token = await TokenProvider.GetTokenAsync();
    
        var httpClient = clientFactory.CreateClient();
        httpClient.BaseAddress = new Uri("https://localhost:44381/");
    
        // Perform HTTP call to your Web Api end point Hotels
        // Deserialized the response into a list of hotel objects.
        hotels = await httpClient.GetJsonAsync<List<Hotel>>("api/hotels",
                        new AuthenticationHeaderValue("Bearer", token));
    
     }
    }
    

请注意如何将Jwt令牌传递给Wep Api端点。

我必须使用AuthenticationStateProvider吗?

您问是否使用AuthenticationStateProvider吗?

通常,您不使用AuthenticationStateProvider。它的子类ServerAuthenticationStateProvider被自动添加到DI容器中,因此您可以将其注入到组件中并使用它。在客户端Blazor中,您必须创建一个自定义AuthenticationStateProvider。

但是,您必须使用诸如AuthorizeRouteView和AuthorizeView之类的组件,它们需要AuthenticationState对象才能起作用,并且由AuthenticationStateProvider提供。

See here, in my answer, 我如何使用它们...

更新

我的意思是,哪个更好?带有signal的blazor服务器或带有webapi的blazor服务器?

Blazor Server App是基于SignalR的SPA,这意味着应用程序(浏览器)的客户端与应用程序(服务器)的服务器端之间的通信是由SignalR实现的。一般来说,SignalR在当前上下文中是构成上述Blazor Server App的两个部分之间的传输和通信方式。

但是,在当前上下文中,Web Api是可以通过HTTP调用访问的Web API。更具体地说,这是一个使用控制器添加到项目中的应用程序,该控制器公开了可以使用HttpClient服务调用的端点。

正如您所看到的,它不是SignalR与Web Api的关系,因为该术语指的是两个完全不同的概念。您可能会问到SignalR与HTTP协议之间的区别...

我会问一个正确的问题,而不是您的问题:我应该如何使用服务器端Blazor应用程序访问数据,我应该使用服务或Web Api?我在其他答案中已经详细回答了这个问题。您也可以查阅文档。

请注意,您应该从Blazor Server应用程序中创建要使用的Web Api项目。

以及如何使用Signalr授权blazor?

我想现在您已经知道答案了。 Server Blazor应用程序基于SignalR。在这方面,您什么也没做。只需创建此类项目,然后开始编码,学习Blazor的核心Blazor组件模型。

最后,我只想提到Blazor客户端或Blazor WebAssembly Apps,不要使用SignalR,而要使用WebAssembly,以防万一。