0

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

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

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

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

我应该使用什么类型的登录实现来解决这个问题。切记security牢记。

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

4

3 回答 3

2

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

例子

[Authorize(Roles="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
    }
}

详细教程可以在这里找到自定义角色提供者

于 2013-09-09T12:50:40.290 回答
1

我不想窃取科林培根的答案。相反,我将添加一些附加信息;我希望第二意见不会受到伤害。

[Authorize(Roles = "Admin")]只需要像这样限制对管理员角色的访问 -

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

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

但是,您需要实现 Custom Role Provider 并覆盖GetRolesForUser方法(其余方法是可选的)

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

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

        return new[] {};            
    }

    ....
}
于 2013-09-09T18:08:34.617 回答
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,...")]
于 2013-09-09T13:36:04.307 回答