ASP.NET Core 5 MVC中User.Identity.Name赋值变量始终为null问题
问题原因分析
- 首先你的第一个代码片段本身存在编译逻辑缺陷:
GetUser方法声明返回值为string,但如果u为null时没有对应的返回语句,正常情况下该代码无法通过编译。如果你通过关闭编译警告、强制运行的方式执行,编译器会对代码做非正常裁剪,你的中间变量u的赋值逻辑可能被优化丢弃,就会出现调试时看到u为null的异常表现。 - 第二个代码片段覆盖了所有返回路径,没有编译缺陷,编译器不会做异常优化,直接读取
User.Identity.Name的实际值,所以运行逻辑符合预期。 - 如果你确认是在Debug模式、关闭代码优化的前提下出现该现象,就是项目开启了C# 可空引用类型特性导致的调试展示偏差:ASP.NET Core 5默认启用可空引用类型,
IIdentity.Name的类型被标记为string?(可空字符串),调试器会优先展示变量的可空标记状态,误判为null,实际运行时读取该变量就能拿到正确值。
正确实现代码
如果需要将用户名、邮箱存入自定义变量,推荐写法如下:
public string GetUser(string name) { // 先校验用户已登录再读取属性,避免空引用 if (User.Identity?.IsAuthenticated == true) { // ! 运算符告知编译器该值实际不会为空,消除可空警告 string userName = User.Identity.Name!; // 邮箱从用户Claims中读取 string userEmail = User.FindFirstValue(System.Security.Claims.ClaimTypes.Email)!; // 你的业务逻辑 return userName; } return "what"; }
内容的提问来源于stack exchange,提问作者Grazosi
相关产品推荐
相关产品推荐

