Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core ASP.NET核心标识-用户声明、用户角色和角色声明_Asp.net Core_Asp.net Identity - Fatal编程技术网

Asp.net core ASP.NET核心标识-用户声明、用户角色和角色声明

Asp.net core ASP.NET核心标识-用户声明、用户角色和角色声明,asp.net-core,asp.net-identity,Asp.net Core,Asp.net Identity,我正在使用ASP.NET Core Identity设置一个应用程序,尽管我仔细阅读了这个主题,但我仍在努力找到适合我的需求的应用程序 熟悉Reddit的subreddit概念的用户可能很理解我的需求,因为这些概念非常相似 本质上,我有一个要求,用户可以是一个“区域”(类似于子Reddit)的版主,而只是另一个“区域”的“用户” 归根结底,当用户登录时,我需要知道他们在每个领域的角色 我正在为ASP.NET Core Identity的AspNetUserClaimes和AspNetRoles/

我正在使用ASP.NET Core Identity设置一个应用程序,尽管我仔细阅读了这个主题,但我仍在努力找到适合我的需求的应用程序

熟悉Reddit的subreddit概念的用户可能很理解我的需求,因为这些概念非常相似

本质上,我有一个要求,用户可以是一个“区域”(类似于子Reddit)的版主,而只是另一个“区域”的“用户”

归根结底,当用户登录时,我需要知道他们在每个领域的角色

我正在为ASP.NET Core Identity的AspNetUserClaimes和AspNetRoles/AspNetUserRoles的实际含义而挣扎

我正在考虑这样定义AspNetRoles:

Id     Name
1000   User
2000   Junior Moderator
3000   Senior Moderator
Id     UserId     ClaimType      ClaimValue
1      1          area:public1   1000
2      1          area:private1  2000
然后设置AspNetUserClaims,如下所示:

Id     Name
1000   User
2000   Junior Moderator
3000   Senior Moderator
Id     UserId     ClaimType      ClaimValue
1      1          area:public1   1000
2      1          area:private1  2000
这意味着ID为1的用户是“public1”区域的“用户”和“private1”区域的初级版主

我对此有很多问题

首先,它试图将两个值填充到“ClaimType”中,从而打破了第一个正常形式

第二,没有适当的引用完整性

仔细观察AspNetUserRoles,我发现用户和角色之间存在多对多关系。除非我将每个可能区域的每个可能角色定义为AspNetRole,否则我看不出这将如何工作。即使如此,我仍不清楚如何以引用安全的方式将其与AspNetUserClaims联系起来

让事情复杂化的是,我不清楚我是只需要声明,还是声明和角色的组合。下面的问题涉及到这个问题,但根据我的要求,我没有看到一条清晰的道路:

没有理由我不能通过实现像上面这样的解决方案来解决我遇到的问题,比如“area:public1”,但这违背了我对系统设计的理解

鉴于上述要求,建议在ASP.NET Core Identity中实现什么

这意味着ID为1的用户是该区域的“用户” “public1”和“private1”区域的初级主持人

如果要实现Id为1的用户具有
用户
角色,并且
用户
角色具有声明
public1
区域
类型

您可以尝试下面的代码来配置数据

    public class HomeController : Controller
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly RoleManager<IdentityRole> _roleManager;
    public HomeController(UserManager<IdentityUser> userManager
        , RoleManager<IdentityRole> roleManager)
    {
        _userManager = userManager;
        _roleManager = roleManager;
    }
    public async Task<IActionResult> Prepare()
    {            
        var userRole = await _roleManager.CreateAsync(new IdentityRole("User"));
        var role = await _roleManager.FindByNameAsync("User");
        var roleClaims = await _roleManager.AddClaimAsync(role, new Claim("area", "public1"));
        var user = await _userManager.FindByNameAsync("UserName");

        var roleToUser = await _userManager.AddToRoleAsync(user, "User");
        return Ok("ok");
    }
公共类HomeController:控制器
{
私有只读用户管理器_UserManager;
专用只读角色管理器(RoleManager);
公共家庭控制器(用户管理器用户管理器
,RoleManager(RoleManager)
{
_userManager=userManager;
_roleManager=roleManager;
}
公共异步任务准备()
{            
var userRole=await_roleManager.CreateAsync(新的IdentityRole(“用户”));
var role=await_roleManager.FindByNameAsync(“用户”);
var roleClaims=wait_roleManager.addClaimesync(角色,新索赔(“区域”,“公共1”));
var user=await_userManager.FindByNameAsync(“用户名”);
var roleToUser=await_userManager.AddToRoleAsync(用户,“用户”);
返回Ok(“Ok”);
}
然后,通过

    public async Task<IActionResult> Index()
    {
        var user = await _userManager.FindByNameAsync("UserName");
        var roles = await _userManager.GetRolesAsync(user);

        var roleClaims = new List<Claim>();
        foreach (var roleName in roles)
        {
            var role = await _roleManager.FindByNameAsync(roleName);
            var claims = await _roleManager.GetClaimsAsync(role);
            roleClaims.AddRange(claims);
        }

        return View();
    }
公共异步任务索引()
{
var user=await_userManager.FindByNameAsync(“用户名”);
var roles=await\u userManager.GetRolesAsync(用户);
var roleClaims=新列表();
foreach(角色中的变量roleName)
{
var role=await_roleManager.FindByNameAsync(roleName);
var claims=wait_roleManager.GetClaimsAsync(角色);
roleClaims.AddRange(索赔);
}
返回视图();
}
对于以上代码,您需要配置
.AddRoles()

        services.AddDefaultIdentity<IdentityUser>()
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();
services.AddDefaultIdentity()
.AddRoles()
.AddEntityFrameworkStores();

外键指向AspNetRoleClaims表是否被认为是一种良好的做法?这可能吗?原因是我有一个面积表,它用自己的ID表示面积,所以在幕后是“public1”AreaId可能为6。因此,在这种情况下,我想在Area和RoleClaim之间建立一个关系。这有意义吗?@JonHalliday当然有可能,但不建议这样做,否则,您需要实现自己的
RoleManager
以id
6
检索
public1