在Blazor Server中获取以RunAs启动的浏览器运行用户的用户名
调试Razor Server应用时获取RunAs启动浏览器的用户身份
问题说明
本地用IIS Express调试Razor Server应用时,通过RunAs命令以测试用户身份启动Chrome/Edge,但现有代码无法获取浏览器端的测试用户名——开发环境下用WindowsIdentity.GetCurrent()或Environment.UserName拿到的是操作系统当前登录用户,而生产环境依赖AuthenticationStateProvider的方法在调试时返回null。
解决方案
要获取浏览器端的测试用户身份,需要启用Windows身份验证并配置IIS Express支持该验证方式,具体步骤如下:
修改launchSettings.json配置
在项目的launchSettings.json文件中,找到IIS Express相关配置,开启Windows身份验证并关闭匿名验证:"iisSettings": { "windowsAuthentication": true, "anonymousAuthentication": false, "iisExpress": { "applicationUrl": "http://localhost:xxxx", "sslPort": 0 } }配置身份验证中间件
在Program.cs中确保添加Windows身份验证的中间件,确保请求经过身份验证流程:// 注册Windows身份验证服务 builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme); // 启用身份验证和授权中间件(顺序不能错) app.UseAuthentication(); app.UseAuthorization();修改CurrentUser类的UserName获取逻辑
启用Windows身份验证后,无论开发还是生产环境,都可以通过AuthenticationStateProvider获取浏览器端的用户身份。注意避免异步转同步的死锁问题,建议使用异步方法:public class CurrentUser { private readonly AuthenticationStateProvider _authenticationStateProvider; public CurrentUser(AuthenticationStateProvider authenticationStateProvider) { _authenticationStateProvider = authenticationStateProvider; } // 推荐用异步方法替代同步属性,避免死锁 public async Task<string> GetUserNameAsync() { var authState = await _authenticationStateProvider.GetAuthenticationStateAsync(); return authState.User.Identity?.Name ?? "未知用户"; } }
原理说明
- 直接调用
WindowsIdentity.GetCurrent()获取的是IIS Express进程运行的用户(即你登录系统的用户),而非浏览器端的测试用户。 - 启用Windows身份验证后,ASP.NET Core会通过NTLM/Negotiate协议,从浏览器请求中获取测试用户的身份信息,此时
AuthenticationStateProvider就能拿到正确的用户名。
内容的提问来源于stack exchange,提问作者spud
相关产品推荐
相关产品推荐

