C# 检查用户角色并在布局中设置权限

C# 检查用户角色并在布局中设置权限,c#,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,simplemembership,C#,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Simplemembership,假设我在布局中有一个actionlink,我想展示一下,如果登录的用户是“经理”或“销售人员”两个角色中的任何一个,那么我该怎么做呢? 我所做的工作如下: @if((User.IsInRole("Manager"))||(User.IsInRole("Salesperson"))) { @Html.ActionLink("Sales Reports", "SalesReports", "Reports") } 不幸的是,上面的代码行不通。角色为“销售人员”的用户看不到“销售报告”链接。

假设我在布局中有一个actionlink,我想展示一下,如果登录的用户是“经理”或“销售人员”两个角色中的任何一个,那么我该怎么做呢? 我所做的工作如下:

@if((User.IsInRole("Manager"))||(User.IsInRole("Salesperson")))
{
    @Html.ActionLink("Sales Reports", "SalesReports", "Reports")
}
不幸的是,上面的代码行不通。角色为“销售人员”的用户看不到“销售报告”链接。 我想使“销售报告”链接仅对“经理”角色或“销售人员”角色的用户可见。请告诉我怎么做?
谢谢。

MVC基于角色的操作方式是对操作或控制器使用[Authorize]属性。然后,您可以按如下方式说明授予了哪些角色:

[Authorize(Roles="Manager,Salesperson")]
您也许可以创建一个包含这些操作的局部视图,并根据用户角色显示该视图

[Authorize(Roles="Manager,Salesperson")]
public ActionResult NavigationLinks()
{
     return View("PATH TO PARTIAL");
}

应该和你的线路配合。也许你在“销售人员”这个词上犯了个错误

我还建议将此逻辑移到控制器:

public ActionResult YourAction()
{
  bool isAllowed = User.IsInRole("Manager")||User.IsInRole("Salesperson");
  ViewBag.isAllowed = isAllowed;

  ...
  return View();
}
在你看来:

@if((bool)ViewBag.isAllowed)
{
    @Html.ActionLink("Sales Reports", "SalesReports", "Reports")
}

我重新检查过了,我相信没有拼写错误。我试图做的是在任何用户登录后,根据用户角色在登录页上设置一些权限。我对您提到的ActionResult放在哪里有点困惑。@aritra您不需要单独的ActionResult。我的意思是,您可以在ActionResult中添加这两行代码(ViewBag),这两行代码与您的视图相对应,您希望在其中处理权限。实际上,我的布局中也有ActionLink。如果我想限制布局中那些ActionLink的权限,那么我应该在哪个控制器中添加上述逻辑?这就是我感到困惑的地方。我希望我对你有意义@Andrey.你试过调试它吗?如果你在If上设置了一个断点,并与销售人员一起登录,你会看到什么?它是否达到了if?是的,当与两个角色的用户一起登录时,它会到达断点。如果使用经理角色登录,则会进入If块,但使用销售人员角色则不会。在调试代码时,能否查看用户的角色?你能得到角色名吗?是“销售员”吗?是的,我也得到了这个角色。如果我使用这两个角色中的一个,那么效果很好,但是同时使用这两个条件,即
((User.IsInRole(“经理”))| |(User.IsInRole(“销售人员”))
会产生问题。如果你尝试颠倒顺序(先是“销售人员”,然后是“经理”),那么什么才有效?经理还是销售员?