c# - 根据角色确定用户是否有权访问给定的 Controller 操作

标签 c# asp.net asp.net-mvc-4 asp.net-membership

我正在尝试为我的 ASP.NET MVC4 web 应用程序 构建一个动态菜单。在构建菜单时,我想确保用户不应访问的菜单项不会显示在菜单中。

我正在对每个需要给定角色的页面使用表单例份验证和 [Authorize] 属性。

给定两个字符串 (Controller 和 Action),以及一个登录用户,我如何确定用户是否有权访问该 Controller Action?


我所有的菜单数据都存储在数据库中。我呈现菜单的计划是构建菜单数据的 JSON 对象并将其嵌入到 View 中。然后在客户端,我将使用 Handlebars.js 并将菜单 JSON 对象 插入到模板中。


我正在尝试做的是在呈现菜单数据时检查用户对给定 Controller /操作的权限。我最初的想法是使用反射并查找 Controller 操作方法并检查授权属性是否存在,并检查当前登录的用户是否具有访问该页面的必要角色。如果不是,则不会呈现菜单项。

我总是不愿意使用反射,然而,通常有一种更简单的做事方式。

最佳答案

public static IEnumerable<MethodInfo> GetActions(string controller, string action)
{
    return Assembly.GetExecutingAssembly().GetTypes()
           .Where(t =>(t.Name == controller && typeof(Controller).IsAssignableFrom(t)))
           .SelectMany(
                type =>
                type.GetMethods(BindingFlags.Public | BindingFlags.Instance)
                    .Where(a => a.Name == action && a.ReturnType == typeof(ActionResult))
             );

}

然后

var roles = ((AuthorizeAttribute) (GetActions("ControllerName" + "Controller", "ActionName").First().GetCustomAttributes(typeof (AuthorizeAttribute), false)[0])).Roles;
if(roles.Contains("admin or smth"))
{
        doSomsing();
}

关于c# - 根据角色确定用户是否有权访问给定的 Controller 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14382336/

相关文章:

c# - xamarin 表单中的异步 Task<T> 问题

c# - 如何在 ASP.NET Core 2.1 中获取客户端 IP 地址

c# - IHttpHandler 与 IHttpModule

c# - 在 MVC 中加载页面时是否可以显示验证错误 - 4(使用模型验证)

asp.net-mvc - 为什么要缓存操作结果?

c# - XmlDocument.LoadXml() 抛出 ComException 类型的异常

c# - 如何在 "in"子句中使用 Entity Framework 中的参数?

c# - 如何在 C# 中替换字符串中的特定字符?

c# - 如何在 gridview RowDataBound c# asp.net 中创建按钮单击事件

c# - MVC 4 中单个选择下拉列表的验证