Asp.net mvc 4 .net MVC 4授权(成员资格)

Asp.net mvc 4 .net MVC 4授权(成员资格),asp.net-mvc-4,asp.net-membership,asp.net-authorization,Asp.net Mvc 4,Asp.net Membership,Asp.net Authorization,在我进入.NETMVC4的第一步中,我将创建一个网站,并希望实现用户身份验证/授权 在我的实现中,我希望能够将控件链接到角色。例如,如果我的系统中有2个角色:Admin和User,则在某些视图中,我有3个输入: <input class="search-field rounded" id="field1" type="text"/> <input type="submit" name="submit"/>

在我进入.NETMVC4的第一步中,我将创建一个网站,并希望实现用户身份验证/授权

在我的实现中,我希望能够将控件链接到角色。例如,如果我的系统中有2个角色:Admin和User,则在某些视图中,我有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个,并且能够编辑其中的一个(这只是一个示例)

因此,基本上,我希望能够为控件定义权限,角色应该由权限集合组成(如果您能想出更好的方法,我很乐意听到)

这些就是我的限制,我看到了很多与主题相关的包(比如,和),但我不太确定哪一个最适合解决我的挑战

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


非常感谢您的帮助。

我是这样做的:

//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”)]//这只是为了安全起见 公共行动结果({}
*我用剃须刀。如果没有,请将@替换为。

idlehands23已显示了如何访问和检查角色,但我猜您希望在视图级别使用此功能

在action方法中,我通常将
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(){}

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

我最终创建了自己的自定义成员资格提供程序和角色提供程序

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

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属性的重载


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

谢谢你的回复,但我不确定我是否理解你。您能否详细说明使用您发布的代码的流程?因此,您建议我将当前角色传递回视图,然后视图可以决定如何相应地呈现页面。听起来很有趣,我可以试一试,让你知道它是否适合我。