【问题标题】:How Get RoleID in ASP.NET MVC如何在 ASP.NET MVC 中获取 RoleID
【发布时间】:2012-04-16 18:35:41
【问题描述】:

有什么方法可以在不直接从 DB 中获取的情况下获取 RoleId?我知道我们可以通过以下方式获取角色名称:

string[] allRoles = System.Web.Security.Roles.GetAllRoles();
string[] allRolesForUser = System.Web.Security.Roles.GetRolesForUser(httpContext.User.Identity.Name);

但我需要访问 roleId。

有人知道吗?

【问题讨论】:

  • 角色 API 不提供获取角色 ID 的方法。我想你可以创建一个自定义角色提供者。

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-membership roles


【解决方案1】:

没有。角色提供者不了解数据源。它可以是一个非常慢的 Web 服务,也可以是一个超级豪华的 NoSQL 数据库。提供者不知道您的数据库作为主键。

当然。 SqlMembershipProvider 可以。但是让它暴露密钥可能会导致违反Liskovs Substitution Principle

角色名称应该是唯一的。所以你自己应该能够从数据库中获取它。或者为什么不能直接使用角色名而不是 db 键?

【讨论】:

  • ASP.NET 角色管理器有一个错误。虽然不允许重复的角色,但如果角色之间有空格并为不同的角色放置不同的空格,它们是允许的,最终是同名的多个角色!
  • 错误是你允许空格。
  • 但 .NET 应该将多个空格截断为单个空格并验证!
  • 为什么?这是您的业务规则,而不是会员资格提供者。或者该规则是否列在文档中的任何位置?
  • 防止重复角色的是 .NET 验证,为什么不在这种情况下?
【解决方案2】:

您必须将 aspnet_Roles 表添加到您的模型并使用查询(例如 LINQ)来获取 roleId 。您可以更改 MembershipProvider 但它需要做更多的工作。

【讨论】:

    【解决方案3】:

    你不能。 ASP.NET MVC 不允许使用标准函数获取 RoleId,必须借助角色名称从数据库中获取。

    【讨论】:

      【解决方案4】:

      我意识到这已经有几年了,但是当我碰到它时,我发现没有人真正回答完全回答了这个问题......所以我想我会发布一个完整的解决方案。

      太好了……

      简单地说:

      SELECT RoleId, RoleName FROM aspnet_Roles;
      GO
      

      但是对于获取用户的 RoleIds,它是这样的:

      SELECT UR.RoleID, R.RoleName FROM
      aspnet_Users U, aspnet_Roles R, aspnet_UsersInRoles UR 
      WHERE U.UserName = @Username 
      AND UR.UserId = U.UserId 
      AND UR.RoleID = R.RoleId
      GO
      

      这将为您提供一个包含特定用户的 RoleId 和 RoleName 的 2 列列表。

      实际上,您不应该尝试这样做,因为暴露 RoleId 时可能会出现安全漏洞。您应该只使用 RoleNames 并使用 Membership 和 Roles 方法来管理事物。

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        相关资源
        最近更新 更多