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

C4p*_*1nZ 5 asp.net asp.net-mvc asp.net-mvc-4

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

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

[Authorize(Roles = "Admin")]
public ActionResult Index(){
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果用户不是管理员角色的一部分,此代码将隐藏链接。这基本上是我想要的,但是使用这种方法,如果角色发生变化,我必须更改每个隐藏链接上的角色名称。

不是有类似两者结合的东西吗?(架构见下文)

[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>
    }
}
Run Code Online (Sandbox Code Playgroud)

所以 - 如果用户的角色是“管理员”,则将显示该链接。这可能吗?

tra*_*r0x 5

您可以使用ViewBagViewData,但我建议将模型传递回视图,并使用指示是否显示链接的属性。

\n\n
public class YourViewModel()\n{\n    public bool ShowHiddenLinks { get; set; }\n    // ... whatever other properties\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在您的控制器中执行以下操作:

\n\n
[Authorize(Roles = "Admin")] \npublic ActionResult Index()\n{\n    var yourVm = new YourViewModel();\n    yourVm.ShowHiddenLinks = true;\n\n    return View(yourVm);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

你的观点变成:

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

我特意命名了 viewmodel 属性ShowHiddenLinks,以便它也可以重复用于其他用户的视图。当然,您可以将视图模型扩展到其他角色的功能属性(例如,管理员和版主可以访问的视图,每个视图都有自己独特的一组隐藏链接),或者为每个角色创建一个视图模型\xe2\x80\x94,这一切都取决于关于场景。

\n