从 blazor 页面传递 UserId

Passing UserId from blazor page

我是 blazor 的新手,所以请对我温柔点:)。在我的应用程序中有一个向服务器发送 POST 请求的按钮。被调用的端点做了很多事情,但我需要获取当前登录用户的 ID。所以我将它与请求一起传递。每次请求通过时,结果都是 System.Threading.Tasks.Task`1[System.String]。我不知道我做错了什么我知道它必须对我的异步方法做一些事情,但是经过几个小时的尝试和错误我很无助。

有人知道我为什么得到错误的值吗?有没有更好的方法来传递用户的 Id?我觉得我的方案不太理想。

非常感谢!

我的 .razor 是:

@page "/Overview"
<AuthorizeView>
    <Authorized>
        <div class="btn btn-warning btn-sm" style="border-color:black" @onclick="SyncTrades">Sync trades</div>

    </Authorized>
    <NotAuthorized>
        You are not signed in. Please sign in.

    </NotAuthorized>
</AuthorizeView>

@using BlazorPro.Spinkit
@using System.Net.Http.Json
@inject HttpClient Http
@using System.Security.Claims
@using Microsoft.AspNetCore.Components.Authorization
@inject AuthenticationStateProvider AuthenticationStateProvider


@code {
    protected async Task SyncTrades()
    {
        var userId = GetUserId().ToString();
        await Http.PostAsync("https://localhost:44366/api/SyncTrades/" + userId, new StringContent(""));
    }

    private string _authMessage;
    private string _surnameMessage;
    private IEnumerable<Claim> _claims = Enumerable.Empty<Claim>();

    private async Task<string> GetUserId()
    {
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        return user.Claims.FirstOrDefault().Value;
    }

}

我的控制器post方法

// POST api/<SyncTradesController>
    [HttpPost("{UserId}")]
    //public void Post([FromRoute]string UserId)
    public async Task Post([FromRoute] string UserId)
    {
        DoStuff();
    }

您应该 await GetUserId() 调用,因为它是一个异步方法:

    protected async Task SyncTrades()
    {
        var userId = await GetUserId(); //.ToString() is redundant here
        await Http.PostAsync("https://localhost:44366/api/SyncTrades/" + userId, new StringContent(""));
    }

为清楚起见,建议使用 Async -> GetUserIdAsync().

后缀 Task(或 Task<T>)返回方法

一个(更好的)替代方案是通过 headers.There 传递 UserId 是多种替代方案,但那是另一个世界!

关于认证;你可以从这里开始阅读:https://docs.microsoft.com/en-us/aspnet/core/blazor/security/?view=aspnetcore-5.0#blazor-server-authentication