gpt4 book ai didi

c# - ASP.NET 标识 - 简化

转载 作者:行者123 更新时间:2023-11-30 23:02:12 29 4
gpt4 key购买 nike

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

enter image description here

  • 1 个用户可以加入 1 个或多个访问组。
  • 1个AccessGroup可以有1个或多个AccessItens。

MSDN Says:

When an identity is created it may be assigned one or more claims issued by a trusted party. A claim is a name value pair that represents what the subject is, not what the subject can do.

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

例如:

  • UserClaims -> Name = CanDeleteSale;值 = 真

但另一方面,我想不出另一种方法来做到这一点。

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

为什么?

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

  • 我只能信任 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com