ASP.Net MVC身份验证 - 根据角色隐藏视图中的元素

时间:2016-10-19 17:37:19

标签: asp.net asp.net-mvc asp.net-mvc-4

是否有可能将授权属性的结果移交给视图?

假设我想根据用户的成员资格在我的索引视图中隐藏5个链接。

[Authorize(Roles = "Admin")]
public ActionResult Index(){
    ....
}

上述代码将阻止所有不属于Admin-Group的用户访问Index页面。

@{
    if(User.IsInRole("Admin"){
        <a href="#">Some link to be hidden</a>
    }
}

如果用户不属于Admin角色,则此代码将隐藏链接。这基本上就是我想要的但是如果角色会改变,我必须在每个隐藏的链接上更改角色名称。

是不是有两者兼而有之? (架构见下文)

[Authorize(Roles = "Admin")] //This will pass true to the View if the User is a member of the group "Admin"
public ActionResult Index(){
    ....
}

@{
    if(User.IsAuthenticated){ //This will read the "Token" and if it's true the if statement will get executed.
        <a href="#">Some link to be hidden</a>
    }
}

所以 - 如果用户处于角色“管理员”中,则会显示该链接。这可能吗?

1 个答案:

答案 0 :(得分:3)

您可以使用ViewBagViewData等其他内容,但我建议将模型传回视图,其中包含是否显示链接的属性。

public class YourViewModel()
{
    public bool ShowHiddenLinks { get; set; }
    // ... whatever other properties
}

然后在您的控制器中执行:

[Authorize(Roles = "Admin")] 
public ActionResult Index()
{
    var yourVm = new YourViewModel();
    yourVm.ShowHiddenLinks = true;

    return View(yourVm);
}

你的观点变成了:

@model YourViewModel

/* ShowHiddenLinks is true & this view is meant for admins only,
   so show admin-related links */
@if (Model.ShowHiddenLinks)
{
    <a href="#">Some link to be hidden</a>
}

我故意将viewmodel属性命名为ShowHiddenLinks,因此它对于其他用户的视图也可以重复使用。您当然可以将viewmodel扩展为其他角色的功能属性(例如,管理员和管理员可以访问的视图,每个视图都有自己独立的隐藏链接集),或者每个角色创建一个viewmodel - 这一切都取决于场景。