【问题标题】:ASP.NET Identity - SimplifiedASP.NET 标识 - 简化
【发布时间】:2018-05-28 18:46:58
【问题描述】:

现有数据库模型(简化):

  • 1 个用户可以加入 1 个或多个 AccessGroups。
  • 1 AccessGroup 可以有 1 个或多个 AccessItens。

MSDN Says:

创建身份时,可能会为其分配一个或多个由受信任方发布的声明。声明是一个名称值对,表示主题是什么,不是主题可以做什么

将 AccessItems 存储为 UserClaims 似乎不是一个好主意,

例如:

  • UserClaims -> 名称 = CanDeleteSale;值 = 真

但另一方面,我想不出其他方法。

经过大量搜索,我想不出如何使用 ASP.NET Identity 中的角色或声明来表示此模型。

为什么?

  • 管理员用户可以自定义 AccessGroups,然后使用声明性角色不适合这种情况。

  • 我只能信任 AccessItens,因为它们是固定的 Id,就像枚举一样,所以我想使用枚举来使用声明性身份验证。

  • 我需要在用户登录后存储所有用户 AccessItems 并将其用于稍后的身份验证操作,使用声明性方式。

ASP.NET Identity 对我来说似乎很漂亮,我现在正试图更好地理解它。

抱歉,如果我不能清楚地表达我的问题,请告诉我任何疑问。

【问题讨论】:

  • 您是否尝试将 AccessItems 作为声明加载 身份验证?您可以缓存它们,这样您就不会在每个请求上都访问数据库。
  • 这是我的第一个想法,但我认为我会错误地使用框架,看看 MSDN 怎么说:“声明是一个名称值对,它代表主题是什么,而不是主题可以做。”

标签: c# asp.net asp.net-core authorization asp.net-identity


【解决方案1】:

我认为你在正确的轨道上。我有很多代表这样的用户角色的经验,我个人的偏好(我主要处理大型企业项目)是使用 ASP.NET 身份进行身份验证并使用自定义代码处理访问控制。

对于较小的项目,我相信您可以像我在下面所做的那样自定义 IsUserInRole 方法。

public class CustomRoleProvider : RoleProvider
{
    /// <summary>
    /// Gets a list of roles assigned to a particular User
    /// </summary>
    /// <param name="UserID">ID of the User</param>
    /// <param name="context">DbContext</param>
    /// <returns></returns>
    public static List<string> GetUserRoles(int UserID, UserContext context)
    {
        return context.UserList
                      .Where(s => s.UserID == UserID)
                      .SelectMany(s => s.AccessGroup.GroupRoles)
                      .Select(gr => gr.RoleID.ToString()).ToList();
    }

    /// <summary>
    /// Gets a list of roles assigned to a particular user
    /// </summary>
    /// <param name="username">username of the user [or "" for current user]</param>
    /// <param name="context">DbContext</param>
    /// <returns></returns>
    public static List<string> GetUserRoles(string username, UserContext context)
    {
        return context.UserList
                      .Where(s => s.Username == username)
                      .SelectMany(s => s.AccessGroup.GroupRoles)
                      .Select(gr => gr.RoleID.ToString()).ToList();
    }

    //roleName = RoleId; so that only the IDs are stored in session...
    public override bool IsUserInRole(string username, string roleName)
    {
        return GetUserRoles(username, new UserContext()).Contains<string>(roleName);
    }

    public override string[] GetRolesForUser(string username)
    {
        return GetUserRoles(username, new UserContext()).ToArray();
    }

    public override string[] GetAllRoles()
    {
        return new UserContext().UserRoleList.Select(r => r.RoleID.ToString()).ToArray();
    }

    public override bool RoleExists(string roleName)
    {
        return new UserContext().UserRoleList.Where(r => r.RoleID.ToString().Equals(roleName)).Count() > 0;
    }

    public override string ApplicationName
    {
        get { return "Your Application Name"; }
        set { }
    }

    public override string[] GetUsersInRole(string roleName)
    {
        throw new System.NotImplementedException();
    }

    public override string[] FindUsersInRole(string roleName, string usernameToMatch)
    {
        throw new System.NotImplementedException();
    }

    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    {
        throw new System.NotImplementedException();
    }

    public override void CreateRole(string roleName)
    {
        throw new System.NotImplementedException();
    }

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
    {
        throw new System.NotImplementedException();
    }

    public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
    {
        throw new System.NotImplementedException();
    }
}

【讨论】:

  • 简单使用@Enoch,tks 回复。我喜欢你的想法,但我想更好地理解使用缓存策略的框架,例如在登录时加载用户的权限,而不是在每个请求时加载。
  • @ViniciusGonçalves 您可以创建一个字符串,其中包含分配给用户的角色 ID,例如登录方法中的“1,3,4,7,9”。将此字符串存储在会话变量中,然后在需要对页面执行身份验证时检索它。使用var roleIDs = Session["RoleIDs"].ToString(); bool isPermitted = roleIDs.Split(',').Contains("1");检查用户是否有正确的权限。
猜你喜欢
  • 2020-04-21
  • 2013-07-12
  • 1970-01-01
  • 2015-06-16
  • 2021-08-15
  • 2017-02-12
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多