在 Blazor .Net 8 中,如何在 HttpClient 中使用 Cookie 身份验证作为在同一项目上调用 WebApi 的交互式自动组件的服务器部分

问题描述 投票:0回答:1

我使用

创建了一个 .Net 8 Blazor 项目
  • 个人身份
  • 互动自动
  • 每个组件的交互性。

我将 Nuget 包添加到 .Client 项目中

Microsoft.Extensions.Http

添加到.Server 和.Client Program.cs

builder.Services.AddHttpClient();

以及 .Server Program.cs 的 API

app.MapGet("/hello", () =>
{
   return "hello";
})
.RequireAuthorization();

然后我通过调用 Web API 更新了 Auth.razor 页面。此代码在没有预渲染的情况下执行,首先使用 Blazor Server,然后从第二次重新加载开始使用 Webasssembly。

@page "/auth"

@using Microsoft.AspNetCore.Authorization

@attribute [Authorize]
@rendermode @(new InteractiveAutoRenderMode(prerender: false))
@inject HttpClient Client

<PageTitle>Auth</PageTitle>

<h1>You are authenticated</h1>

<AuthorizeView>
    Hello @context.User.Identity?.Name!
</AuthorizeView>

@Message

@code
{
    private string Message;
    protected override async Task OnInitializedAsync()
    {
        try
        {
            Message = await Client.GetStringAsync("https://localhost:7235/hello");
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);   
        }
    }
}

启动应用程序时,我使用新的开箱即用身份系统注册/登录,并获取 cookie。

问题是,当HttpClient调用API时,仅使用WebAssembly,它使用浏览器中的cookie进行身份验证;当首先使用 Blazor Server 调用相同的代码时,API 调用未经过身份验证,并返回错误页面的 HTML。

工作流程:

  1. 我登录,然后进入身份验证页面
  2. 首次使用 Blazor 服务器加载:HttpClient 调用未经过身份验证
  3. 使用 WebAssembly 的所有其他加载:httpClient 使用 cookie,并且经过身份验证,返回“hello”

如果我切换到“InteractiveWeb assembly”,它就可以工作。 如果我切换到“InteractiveServer”,它就不起作用。 如果我通过浏览器直接调用 API,它就可以工作。

我想要的是为两者使用一个代码库。 有没有办法让 HttpClient 在 Blazor 服务器第一次使用时使用 cookie 身份验证令牌?

或者需要创建多样化并在 Blazor-Server 时仅调用 C# 后端代码?

asp.net-identity blazor-server-side .net-8.0
1个回答
0
投票

我也有同样的问题。这让我发疯。请帮忙。

© www.soinside.com 2019 - 2024. All rights reserved.