如何根据用户登录角色在ASP.NET MVC视图中展示对应操作链接
实现基于用户角色的链接显示控制
要解决这个问题,我们需要在登录时记录用户角色,然后在View中根据角色动态控制Delete链接的显示。下面一步步来修改你的代码:
1. 完善登录时的角色标识存储
首先,你的ADO类目前用静态变量存储用户名,但静态变量在多用户环境下会被覆盖,非常不安全。我们需要添加一个标识来记录当前用户是否是管理员,并且在登录后把这个信息存入Session(Session是每个用户独立的,不会互相干扰)。
修改ADO类代码
// 添加静态属性标记是否为管理员 public static bool IsAdmin { get; set; } public static void Logindata(MyModel objmymodel) { SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=c:\users\nisarg parekh\documents\visual studio 2013\Projects\WebApplication5\WebApplication5\App_Data\Database1.mdf;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework"); con.Open(); try { if(objmymodel.Username=="admin" && objmymodel.Password=="admin") { usernamestring = "admin"; message = "welcome " + objmymodel.Username; IsAdmin = true; // 标记为管理员 } else { // 注意:这里一定要用参数化查询,避免SQL注入! string check = "select Username,Password from tb1 where Username=@Username and Password=@Password"; SqlCommand cmd = new SqlCommand(check, con); cmd.Parameters.AddWithValue("@Username", objmymodel.Username); cmd.Parameters.AddWithValue("@Password", objmymodel.Password); SqlDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { usernamestring = objmymodel.Username; message ="welcome "+ objmymodel.Username; IsAdmin = false; // 普通用户 } else { message = "FAIL"; IsAdmin = false; } } } finally { con.Close(); // 确保连接关闭,避免资源泄漏 } }
2. 在Controller中存储角色到Session
登录成功后,把管理员标识存入Session,这样View就能访问到用户的角色信息:
public ActionResult Login() { return View(); } [HttpPost] public ActionResult Login(MyModel objmymodel) { ado.Logindata(objmymodel); if (ado.message == "FAIL") { objmymodel.Username = ""; objmymodel.Password = ""; TempData["Message"] = ado.message; return RedirectToAction("Login"); } else { // 存储管理员标识到Session Session["IsAdmin"] = ado.IsAdmin; TempData["Message"] = $"welcome {ado.usernamestring}"; return RedirectToAction("Show"); } }
另外,建议给Show方法加登录校验,防止未登录用户直接访问:
public ActionResult Show() { // 检查是否已登录 if(Session["IsAdmin"] == null) { return RedirectToAction("Login"); } // 这里补充你的数据获取逻辑,比如从数据库读取MyModel列表 List<MyModel> data = // 你的数据查询代码 return View(data); }
3. 在View中动态控制链接显示
最后,在View里判断Session中的IsAdmin值,只有管理员才显示Delete链接:
@model List<WebApplication5.Models.MyModel> @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Show</title> </head> <body style="background-color:aliceblue"> <div> @TempData["Message"] <b><center>Data Of Table</center></b> <table style="background-color:azure" border="1" align="center" title="DATA OF EMPLOYEE"> @foreach (var objmymodel in Model) { <tr> <td>@objmymodel.Username</td> <td>@objmymodel.Password</td> <!-- 所有用户都显示Update链接 --> <td>@Html.ActionLink("update", "Update", new { id = @objmymodel.Id })</td> <!-- 仅管理员显示Delete链接 --> @if ((bool)Session["IsAdmin"]) { <td>@Html.ActionLink("delete", "Delete", new {id=@objmymodel.Id })</td> } </tr> } </table> </div> <div>@Html.ActionLink("Logout","Login","Mycontroller")</div> </body> </html>
额外优化建议
- 替换静态变量:你的ADO类用了静态变量
usernamestring和message,在多用户场景下会导致数据混乱,建议改成返回一个包含用户名、消息、角色的自定义对象,而不是依赖静态变量。 - 密码加密:目前代码明文存储和校验密码,非常不安全,建议用MD5、SHA256等哈希算法加盐加密后存储和校验。
- Session过期处理:可以在Web.config中配置Session的过期时间,避免用户长时间未操作仍保持登录状态。
内容的提问来源于stack exchange,提问作者nisarg parekh
相关产品推荐
相关产品推荐

