现有数据库模型(简体):
1个用户可以加入1个或多个AccessGroup。
1个AccessGroup可以具有1个或多个AccessItens。
MSDN Says:
创建身份后,可以分配一个或多个由受信任方发出的声明。声明是一个名称值对,表示对象是什么,而不是对象可以做什么。
将AccessItems存储为UserClaims似乎不是一个好主意,
例如:
UserClaims-> Name = CanDeleteSale;值=真
但另一方面,我无法想到另一种方法。
经过大量搜索之后,我想不起来如何使用ASP.NET Identity中的角色或声明来表示此模型。
为什么?
管理员用户可以自定义AccessGroup,然后在这种情况下不适合使用声明性角色。
我只能信任AccessItens,因为它们像枚举一样是固定的ID,因此我想对此使用枚举来使用声明式身份验证。
我需要在用户登录后存储所有用户AccessItems,然后使用声明方式将其用于身份验证操作。
对我来说,ASP.NET Identity似乎很漂亮,我现在想更好地理解它。
抱歉,如果我不能清楚地表达我的问题,请告诉我任何疑问。
最佳答案
我认为您在正确的轨道上。我在代表这样的用户角色方面有很多经验,我个人的喜好(我主要处理大型企业项目)是使用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();
}
}
关于c# - ASP.NET身份-简化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50572056/