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
相关产品推荐
相关产品推荐

