2013-02-15 125 views
1

在我在.NET MVC 4中的第一步,我创建了一个网站,我想实现用户认证/授权。.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)涉及到这个问题,但我不太确定哪个是最好解决我的挑战,如果有的话。

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

任何帮助,高度赞赏。

回答

0

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

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

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

我希望这可以帮助别人..

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”)] //这只是为了安全 public ActionResult whatever(){} *我使用剃须刀。如果不是,则用@ <%%替换@。

+0

谢谢你的回复,但我不知道我得到你。您能否详细说明使用您发布的代码的流程? – forhas 2013-02-16 23:55:14

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(){} 

然后你可以在与他们被授权确定性视图级别实现逻辑。

+0

因此,你建议我将当前角色传递回视图,然后视图可以决定如何相应地呈现页面。听起来很有趣,我可能会试一试,并告诉你它是否适合我。 – forhas 2013-02-16 23:58:17