首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET身份-简化

ASP.NET身份-简化
EN

Stack Overflow用户
提问于 2018-05-29 02:46:59
回答 1查看 134关注 0票数 2

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

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

MSDN Says:

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

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

例如:

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

但从另一方面来说,我想不出另一种方法。

在搜索了很多次之后,我想不出如何在ASP.NET身份中使用角色或声明来表示这个模型。

为什么?

  • 管理员用户可以自定义AccessGroups,,然后使用声明性角色不适合这种情况。
  • 我只能信任AccessItens,因为它们是固定Id的类似枚举,因此我希望对此使用枚举使用声明性身份验证。
  • 我需要在用户登录后存储所有用户访问项,并在以后使用声明性方式用于身份验证操作。

ASP.NET身份对我来说似乎很美好,我现在正试图更好地理解它。

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-29 07:10:51

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

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

代码语言:javascript
复制
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();
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50572056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档