MVC4,基于用户表授权用户

时间:2014-01-22 11:25:37

标签: c# security asp.net-mvc-4 design-patterns

我遇到了在我的MVC应用上授权安全性的问题。我看到很多人使用AUTHORIZE,但我不确定如果我定义自定义角色,这是否有助于解决我的问题。我有一个用户的SQL表,每个用户都分配了我的MVC应用程序的角色(例如管理员,程序员,用户),他们的用户名是他们的Windows用户名。 Windows用户名在进入我的主页时被抓取,因此他们只能看到他们的东西,并且应该禁用某些功能(例如,在主页上禁用删除ActionLink,下拉框仅在编辑页面上填充特定值) 。现在我有一个LINQ查询检查存储库以查看它们是什么类型的用户。此外,管理员和程序员应该可以访问用户无法访问的另一个特殊页面。

最好的设计模式是创建两个单独的Index()/ Edit()页面还是创建Html帮助程序类来禁用/启用/隐藏ActionLinks和其他控件?对于特殊页面,如何实施安全性以限制未经授权的用户?感谢。

编辑:我在https://github.com/NickKip/ASPNETCustomMembershipExample

找到了一个很好的资源

2 个答案:

答案 0 :(得分:1)

您可以使用现有的AuthoriseAttribute,但您应该执行的是自定义Principal类,它将使用您自己的DB角色。在Principal课程中,您将实现IsInRole方法:

public bool IsInRole(string role)
{
    if(this.Roles == null)
        this.Roles = DependencyResolver.Current
           .GetService<ISecurityService>()
           .GetUserPermissions(this.Identity.Name);

    return this.Roles.Any(p => p.Name == role);
}

您应该在Global.asax

中设置自定义Principal
    void OnPostAuthenticateRequest(object sender, EventArgs e)
    {
         // Get a reference to the current User 
        IPrincipal user = HttpContext.Current.User; 

        // If we are dealing with an authenticated forms authentication request         
        if (user.Identity.IsAuthenticated && user.Identity.AuthenticationType == "Forms") 
        { 
            // Create custom Principal 
            var principal = new MyCustomPrincipal(user.Identity); 

            // Attach the Principal to HttpContext.User and Thread.CurrentPrincipal 
            HttpContext.Current.User = principal; 
            System.Threading.Thread.CurrentPrincipal = principal; 
        }
    } 

您可以使用适当的Authorise属性标记您的操作,并且可以在视图中使用User.IsInRole来有条件地呈现链接。

答案 1 :(得分:0)

在这里发现了类似的问题和回应

ASP.NET MVC Alternatively Rendering EditorFor Based on User Role

我认为您使用html帮助程序来呈现视图是正确的。如果有人能提出一个更好的主意,那么最受欢迎。

MVC中的authorize属性具有提供角色的选项。这有助于我们限制对控制器成员的访问。 http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx#using_authorizeattribute