【发布时间】:2019-11-07 21:08:25
【问题描述】:
基本上,我过去几天一直在试图弄清楚如何将简单的管理员和成员角色添加到我正在为朋友开发的网站上。 (我使用的是 ASP.NET Framework 5.2.7.0)。我知道微软内置了一个很好的基于角色的访问功能,它允许您在控制器顶部放置[Authorize Role=("Admin") 之类的东西;但是我根本无法让它工作,而且我发现的大部分资源都是针对 ASP.NET Core 的。
我尝试修改我的 web.config 文件以启用基于角色的访问(并希望将角色等迁移到我的数据库)。但由于我无法弄清楚这一切,我尝试了一条更老套的路线。 (**我不是高级程序员,我已经这样做了大约一年,绝不是专业人士)。这是我在尝试验证用户是否是管理员时基本上想出的(这也不起作用)。
[Authorize]
public class AdminController : Controller
{
private LDSXpressContext db = new LDSXpressContext();
public ActionResult AdminPortal()
{
IsAdmin();
return View();
}
private ActionResult IsAdmin()
{
string name = User.Identity.Name;
//The User.Identity.Name stores the user email when logged in
var currentUserObject = db.accounts.Where(x => x.clientEmail == name);
Account currentUser = new Account();
foreach (var user in currentUserObject)
{
//I loop through the results, even though only one user should
//be stored in the var CurrentUserObject because it's the only
//way I know how to assign it to an object and get its values.
currentUser = user;
}
if (currentUser.role == 2) //the number 2 indicates admin in my db
{
return null;
}
else
{
//Even when this is hit, it just goes back and returns the
//AdminPortal view
return RedirectToAction("Index", "Home");
}
}
}
现在我几乎可以肯定,这不是检查登录用户是否是管理员的一种非常安全的方法,但我希望它至少可以工作。我的想法是当有人试图访问 AdminPortal 时,IsAdmin 方法将运行并检查用户是否是数据库中的管理员。如果是,则返回 null 并显示 AdminPortal 视图,如果它们不是 Admin,则将它们重定向到主页上的 Index 视图。但是,AdminPortal 页面始终显示给任何用户,这似乎也不起作用。我什至进入了代码并观察它在return RedirectToAction("Index", "Home"); 操作上运行,但随后它跳回到 AdminPortal 方法并仅返回 AdminPortal 视图。所以我的问题是:
1) 如果有人碰巧有在 ASP.NET 框架中使用基于角色的访问的经验,我会喜欢一些关于如何设置它的提示
或者,
2)如果所有其他方法都失败并且我需要使用我的 hacky 方法,为什么即使用户不是管理员,它也会继续返回 AdminView。
**注意:我知道我可以创建一个函数,如果用户是否是管理员,则返回 true 或 false,然后在 AdminPortal 控制器中有一个 if/else 语句,该语句将返回视图为 true,另一个为false,但是我不想在每个 ActionMethod 上都实现它,最好将其保留为一行,或者如果可能的话,将其保留在控制器上方的 [Authorize Role="Admin] 会很好。
非常感谢你们提供的任何帮助,我这几天一直在努力研究和解决这个问题,并决定联系社区并询问!
【问题讨论】:
-
通过“ASP.NET Framework”,我假设您的意思是这是一个 ASP.NET MVC 5 或更低版本的项目?
-
老实说,我真的不知道。我刚刚被告知这是 ASP.NET 框架,这就是我所知道的。我想我得去做一些研究才能弄清楚这一点!
-
一般来说,如果有人说“ASP.NET”,他们的意思可能是“ASP.NET WebForms”,这已经有一段时间了。您所拥有的看起来类似于 ASP.NET MVC,它构建在 ASP.NET 之上,但将整体“表单”换成了模型-视图-控制器模式。
标签: asp.net asp.net-mvc role-based-access-control