You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor WebAssembly服务端如何自动获取当前登录用户邮箱?

问题

我在Blazor客户端的AssetList.Razor页面中已能获取登录用户名,代码如下:

AssetList.Razor

@inject IAssetService AssetService
@inject AuthenticationStateProvider GetAuthenticationStateAsync

@code {
    protected override async Task OnInitializedAsync()
    {
        var authstate = await GetAuthenticationStateAsync.GetAuthenticationStateAsync();
        var user = authstate.User;
        var name = user.Identity.Name;

        if (name != null)
        {
            await AssetService.GetAssets();
        }
    }
}

随后通过客户端AssetService从数据库获取数据,代码如下:

客户端AssetService

namespace MyAssets.Client.Services.AssetService
{
    public class AssetService : IAssetService
    {
        private readonly HttpClient _http;

        public AssetService(HttpClient http)
        {
            _http = http;
        }

        public List<Asset> Assets { get; set; } = new List<Asset>();

        public async Task GetAssets()
        {
            var result =
                await _http.GetFromJsonAsync<ServiceResponse<List<Asset>>>("api/asset");
            if (result != null && result.Data != null)
                Assets = result.Data;
        }
    }
}

服务端AssetService

namespace MyAssets.Server.Services.AssetService
{
    public class AssetService : IAssetService
    {
        private readonly ApplicationDbContext _context;

        public AssetService(ApplicationDbContext context)
        {
            _context = context;
        }

        public async Task<ServiceResponse<List<Asset>>> GetAssetsAsync()
        {
            // 手动设置的当前用户邮箱
            var currentUserEmail = "currentLoggedinUser.com";

            // 获取当前用户拥有的资产
            var response = new ServiceResponse<List<Asset>>
            {
                Data = await _context.Assets
                .Where(x => x.AssetOwner == currentUserEmail)
                .ToListAsync()
            };

            return response;
        }
    }
}

目前手动设置currentUserEmail变量后,可显示当前登录用户的资产,但不清楚如何在Blazor服务端自动设置该变量以获取当前登录用户的邮箱?


解决方案

要在Blazor服务端自动获取当前登录用户的邮箱,可按以下步骤实现:

1. 注入身份验证相关服务

在服务端AssetService中注入UserManager<IdentityUser>(基于ASP.NET Core Identity)和IHttpContextAccessor,用于获取当前用户上下文信息:

private readonly ApplicationDbContext _context;
private readonly UserManager<IdentityUser> _userManager;
private readonly IHttpContextAccessor _httpContextAccessor;

public AssetService(ApplicationDbContext context, UserManager<IdentityUser> userManager, IHttpContextAccessor httpContextAccessor)
{
    _context = context;
    _userManager = userManager;
    _httpContextAccessor = httpContextAccessor;
}

注意:如果项目未注册IHttpContextAccessor,需在Program.cs中添加注册代码:

builder.Services.AddHttpContextAccessor();

2. 自动获取当前用户邮箱

在GetAssetsAsync方法中,通过两种方式获取用户邮箱:

方式一:直接从Claims提取邮箱

ASP.NET Core Identity默认会将用户邮箱存入Claims,可直接提取:

public async Task<ServiceResponse<List<Asset>>> GetAssetsAsync()
{
    var currentUser = _httpContextAccessor.HttpContext.User;
    var currentUserEmail = currentUser.FindFirstValue(ClaimTypes.Email);

    if (string.IsNullOrEmpty(currentUserEmail))
    {
        return new ServiceResponse<List<Asset>> 
        { 
            Success = false, 
            Message = "无法获取当前用户邮箱" 
        };
    }

    var response = new ServiceResponse<List<Asset>>
    {
        Data = await _context.Assets
        .Where(x => x.AssetOwner == currentUserEmail)
        .ToListAsync()
    };

    return response;
}

方式二:通过UserManager获取用户详情

若邮箱未存入Claims,或需要更多用户信息,可通过UserManager查询:

public async Task<ServiceResponse<List<Asset>>> GetAssetsAsync()
{
    var currentUserId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
    if (string.IsNullOrEmpty(currentUserId))
    {
        return new ServiceResponse<List<Asset>> 
        { 
            Success = false, 
            Message = "无法获取当前用户ID" 
        };
    }

    var user = await _userManager.FindByIdAsync(currentUserId);
    if (user == null)
    {
        return new ServiceResponse<List<Asset>> 
        { 
            Success = false, 
            Message = "用户不存在" 
        };
    }

    var response = new ServiceResponse<List<Asset>>
    {
        Data = await _context.Assets
        .Where(x => x.AssetOwner == user.Email)
        .ToListAsync()
    };

    return response;
}

3. 确保客户端请求携带身份信息

如果是Blazor WebAssembly项目,默认HttpClient会自动携带认证Cookie(基于Cookie认证)。若需自定义配置,可在Program.cs中注册HttpClient时确保身份信息被正确附加:

builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

内容的提问来源于stack exchange,提问作者OssieINXS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:17:23