【问题标题】:.net MVC 4 Authorization (Membership).net MVC 4 授权(会员)
【发布时间】:2013-01-31 21:19:33
【问题描述】:

在 .NET MVC 4 的第一步中,我正在创建一个网站,我想实现用户身份验证/授权。

在我的实现中,我希望能够将控件链接到角色。例如,如果我的系统中有 2 个角色:管理员和用户,那么在某些方面说我有 3 个输入:

            <input class="search-field rounded" id="field1" type="text"/>
            <input type="submit" name="submit"/>

            <input class="search-field rounded" id="field2" type="text"/>
            <input type="submit" name="submit"/>

            <input class="search-field rounded" id="field3" type="text"/>
            <input type="submit" name="submit"/>

我希望管理员能够查看和编辑此视图中的所有 3 个字段,但用户应该只能看到其中的 2 个,并且能够编辑其中一个(这只是一个示例)。

所以基本上,我希望能够为控件定义权限,并且角色应该由一组权限组成(如果您能想到更好的方法,我很乐意听到它)。

所以这些是我的限制条件,我看到很多与该主题相关的软件包(例如 Fluent SecuritySecurity Guard),但我不太确定哪个最能解决我的挑战如果有的话。

是否有克服这种需求的最佳实践?

非常感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

    我是这样做的:

    //In Controller
    ViewBag.Roles = Roles.GetRolesForUser(User.Identity.Name);//viewbag because I'm assuming this isn't what you want to strongly type to your page.
    
    //In View
    @{
      var roles = (Roles)ViewBag.Roles;
    } 
    if(roles.contains("admin')) //put whatever you want in place of "admin"
    {
        //do something
    }
    

    在您的控制器中,您可以通过这种方式授予对某些视图或部分视图的访问权限 //如果需要,在控制器中。
    [Authorize(Roles = "Admin, ImportExport, Search")] //这只是为了安全 公共 ActionResult 随便(){} *我用剃须刀。如果不是,请用 替换 @。

    【讨论】:

    • 感谢您的回复,但我不确定我是否了解您。您能否详细说明使用您发布的代码的流程?
    【解决方案2】:

    idlehands23 展示了您如何访问和检查角色,但我猜您想在视图级别使用此功能。

    在操作方法中,我通常将HttpContext.User 传递给ViewBag,或者在强类型视图的情况下,您可以将主体传递到您的模型中并根据需要解析这些值。然后像这样将模型传递给视图。

    return View(new ModelClass(HttpContext.User))
    

    您可以在此处将其他代码添加到视图逻辑中,以解析/检查角色并以更高的特异性呈现 html,例如:

    If (Model.User.IsInRole("Admin"))
    {
        //Render admin controls
        //...
    }
    else
    {
       //Render User Controls
       //...
    }
    

    在您的操作方法上使用[Authorize(Role="Admin||User")] 属性将限制对整个用户组的访问。在这种情况下,您将需要两个操作方法和一个或可能两个不同的视图来呈现内容。但是,如果您只想将其限制为任何授权用户,您可以这样做:

        [Authorize]
        public ActionResult Index(){}
    

    然后您可以在视图级别实现逻辑,并确定它们已获得授权。

    【讨论】:

    • 所以你建议我将当前角色传回视图,然后视图可以决定如何相应地渲染页面。听起来很有趣,我可能会试一试,让你知道它是否适合我。
    【解决方案3】:

    我最终创建了自己的自定义会员提供程序和角色提供程序。

    在我的角色提供者中,我添加了一个方法

    public bool UserHasPermission(string username, string permission) {...}
    

    在我看来,我正在做:

    @{
        var roleProvider = Roles.Provider as MyCustomRoleProvider;
        bool addressEditPermission = roleProvider.UserHasPermission(User.Identity.Name, "addressEditPermission");
    }
    

    然后我可以操纵我的控制:

    @Html.TextBoxFor(model => model.Name, new { @readonly = addressEditPermission })
    

    您只需要确保您的控件具有采用 HTML 属性的重载。

    我希望这对某人有所帮助..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      相关资源
      最近更新 更多