如何在视图中读取自定义Claims值实现前端菜单权限控制
问题排查及修复方案
问题1:判断逻辑完全写反
你当前的判断逻辑是AdminPannel值不等于true时显示菜单,和你需求的AdminPannel为false时隐藏菜单完全相反。
问题2:空引用异常风险
如果用户身份未加载、或者AdminPannel的Claim不存在时,FindFirst会返回null,直接调用.Value会触发空引用异常导致页面报错。
问题3:HTML语法错误
视图里的a标签缺少闭合尖括号,会导致HTML渲染异常,哪怕逻辑正确菜单也可能无法正常显示/隐藏。
问题4:登录后即时读取Claim失效
如果是登录成功后立即在当前跳转的页面读取Claim,当前请求的User.Identity还保留的是登录前的匿名身份信息,需要下一次页面请求(或登录后主动重定向一次)才能读取到新写入的Claim。
问题5:bool.Parse兼容性问题
Claim存储的是字符串类型,如果你传入AdminPannel参数时是小写的"false"/"true"、或者用"0"/"1"标识布尔值,bool.Parse会解析失败抛出异常。
修复步骤
- 先确认
SignInUser方法传参正确性:调用时确保AdminPannel参数传入的是标准布尔值转字符串的结果,比如AdminPannel = isAdmin.ToString(),避免字符串格式不标准导致解析失败。 - 替换视图判断代码:
@if (User.Identity.IsAuthenticated) { var adminPannelClaim = ((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirst("AdminPannel"); // 只有Claim存在且值为True的时候才显示菜单 if (adminPannelClaim != null && bool.TryParse(adminPannelClaim.Value, out bool isAdminPannel) && isAdminPannel) { <li class="nav-header">Master Forms</li> <li class="nav-item"> <a href="@Url.Action("Index", "M_Company")" class="nav-link"> <i class="nav-icon fas fa-table"></i> <p>Add Company</p> </a> </li> } }
内容的提问来源于stack exchange,提问作者smc develpments
相关产品推荐
相关产品推荐

