Web用户和管理员对某些控制器和视图的限制

时间:2013-09-09 12:47:28

标签: asp.net asp.net-mvc login asp.net-membership cloud

我正在ASP.Net MVC上开发一个云应用程序。我在登录系统的实现方面遇到了问题。

我做了什么
我使用FormsAuthentication.SetAuthCookie(...)登录网络用户。
和控制器中的Authorize一样

  [Authorize]
  [HttpGet]
  public ActionResult AdminPage(){...}

问题是什么
当我sign in与网络用户credentials并尝试访问管理员控制器时,它无法阻止该用户,他可以访问所有用户(包括管理页面)。

我应该使用什么类型的登录隐私来解决此问题。请务必记住security

我也看到了ASP.Net MemberShip Class,但它自己生成了数据库。它可以模具化,并且可以与用户定义数据库一起使用。

3 个答案:

答案 0 :(得分:2)

您可以在Authorize属性上指定角色。

示例

[Authorize(Roles="Admin")]

这意味着只有具有admin角色的用户才能访问该方法。

更新

如果您使用自定义角色,则需要创建Custom Role Provider。这将允许您覆盖RoleProvider方法并添加自己的逻辑。

示例

public class CustomRoleProvider : RoleProvider
{
    public override bool IsUserInRole(string username, string roleName)
    {
        // Custom logic
    }

    public override string[] GetRolesForUser(string username)
    {
        // Custom logic
    }

    public override string[] GetAllRoles()
    {
        // Custom logic
    }
}

详细教程可以在Custom Role Providers

找到

答案 1 :(得分:1)

我不想偷走科林培根的回答。相反,我会添加一些额外的信息;我希望第二意见不会受到伤害。

您需要[Authorize(Roles = "Admin")]才能限制对管理员角色的访问权限 -

[Authorize(Roles = "Admin")]
public ActionResult AdminPage(){...}

由于您的MVC应用程序已使用FormsAuthentication,因此您不需要使用MembershipProvider

但是,您需要实现自定义角色提供程序并覆盖GetRolesForUser方法(其余方法是可选的)

基本上,当用户使用[Authorize(Roles = "Admin")]访问操作时,AuthorizeAttribute将调用GetRolesForUser方法。

public class CustomRoleProvider : RoleProvider
{
    public override string[] GetRolesForUser(string username)
    {
        // Query admin table.
        if(user is in admin table)
            return new[] {"Admin"}; 

        return new[] {};            
    }

    ....
}

答案 2 :(得分:0)

首先在web.config中添加此(system.web)

<roleManager enabled="true" defaultProvider="simple">
  <providers>
    <clear />
    <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider,WebMatrix.WebData" />
  </providers>
</roleManager>
<membership defaultProvider="simple">
  <providers>
    <clear />
    <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider,WebMatrix.WebData" />
  </providers>
</membership>

然后将此行添加到Application_Start

中的Global.asax
WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("DefaultConnection",
                   "UserProfile", "UserId", "UserName", autoCreateTables: true);

然后你可以将用户添加到这样的角色

var roles = (SimpleRoleProvider)Roles.Provider;

roles.AddUsersToRoles(new[] { "username1", "username2", ... },
                      new[] { "role1", "role2", .... });

然后在控制器或方法上添加AuthorizeAttribute,如下所示

[Authorize(Roles="role1,role2,...")]