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.Core.Identity中可以有多少声明?_Asp.net Core_Asp.net Identity - Fatal编程技术网

Asp.net core 角色/用户在ASP.Net.Core.Identity中可以有多少声明?

Asp.net core 角色/用户在ASP.Net.Core.Identity中可以有多少声明?,asp.net-core,asp.net-identity,Asp.net Core,Asp.net Identity,角色或用户可以拥有多少声明?我一直在使用ASP.Net.Core 2.2和AspNet.Core.Identity开发一个应用程序。在我的浏览器上进行测试之前,一切正常。在VS2019中调试时,不存在此类问题 我部署了我的应用程序进行进一步测试,并遇到了此错误(见下文)。我在IE、GC和FF中也有同样的问题 HTTP Error 400. The size of the request headers is too long. 我正在使用角色和角色目标 经过一番挖掘,我发现这与角色/声明有关,

角色或用户可以拥有多少声明?我一直在使用ASP.Net.Core 2.2和AspNet.Core.Identity开发一个应用程序。在我的浏览器上进行测试之前,一切正常。在VS2019中调试时,不存在此类问题

我部署了我的应用程序进行进一步测试,并遇到了此错误(见下文)。我在IE、GC和FF中也有同样的问题

HTTP Error 400. The size of the request headers is too long.
我正在使用
角色
角色目标

经过一番挖掘,我发现这与角色/声明有关,事实上它们太多了,这会破坏缓存。基本上,
Identity
尝试将所有声明存储在cookie中,而cookie现在太大了

这看起来真的很奇怪,微软会给你所有的复杂性,但却让你被浏览器挫败

因此,我的问题是: -如果由于浏览器限制而无法利用角色/声明,那么角色/声明有什么意义?
-虚拟限制(每个角色的最大索赔数量)是否有任何记录?

限制不是虚拟的,也不是基于浏览器的。请求限制由服务器设置,是一种安全措施。因此,试图提高限额确实不是一个好主意

此外,这里并没有关于索赔最大数量之类的真正指导,因为它是基于变量的:单个索赔的类型和大小,以及请求的其他部分,比如在任何给定时间都可能添加或不添加的附加头。然而,限制通常是8-32K,即使在低端,在达到限制之前,你仍然可以添加相当多的声明。一般来说,你也应该考虑传输大小。声明是身份验证票证的一部分,这意味着客户端必须在每次请求时传输声明。每个请求8K可能看起来不多,但在用户会话的整个生命周期内都会显著增加,尤其是当用户的数据连接速度较慢或受限时

长话短说,你在这里应该做的最好的事情就是减少索赔金额。并非所有东西都需要或应该成为一种主张。在用户配置文件上存储其他数据,并根据需要进行查询。作为声明,您唯一绝对应该拥有的是id、用户名/电子邮件和角色等关键内容。其他任何东西都可以在以后需要时从其他商店购买


首先,还可以选择使用备用存储来实际保存身份验证票证数据。您可以简单地发送一个标识符,然后根据该标识符提取实际数据,这与会话的工作方式类似,而不是将所有内容作为cookie发送,然后必须随每个请求一起发送回cookie。这是通过创建
ITicketStore
的实现并为其设置来实现的。这里有一个。您可能需要修改新版本ASP.NET Core的代码。

只是想让您知道,无论我做了什么尝试,我都无法让ITicketStore正常工作。我甚至花了几天时间阅读了在ITicketStore上能找到的所有文档,这些文档根本没有很好的文档记录。这似乎是一个很常见的问题(cookie和ITicketStore文档)

无论如何,我更改了我的应用程序,以便Asp.Net.Identity只选择用户角色。这就解决了cookie大小的问题

我已经实现了自己的函数来检查角色声明。我觉得这更有效,因为任何更改都是实时发生的,所以无需登录/注销以获取新索赔或撤销现有索赔

我有一个服务函数,它接受一个
IdentityUser
和一个索赔名称(字符串)

我有自己的表,与包含这些值的AspNetRoleClaims表相同。该表的Asp.Net.Identity版本现在为空,因此cookie不包含任何声明

    public bool UserHasClaim(AppUser user, string claimValue)
    {
        var claim = (from c in _context.AppUserRoleClaims
                     join t in _context.AppUserClaimTypes on c.ClaimID equals t.ID
                     join r in _context.UserRoles on c.RoleId equals r.RoleId
                     where r.UserId == user.Id && t.ClaimValue == claimValue select c).FirstOrDefault();

        return (claim != null);
    }
它可能不是完美的或理想的,但它是有效的,我不能再花时间尝试使用identity来解决这个问题。我并不认为它是理想的,我可能会在以后的时间里回到它

我很乐意就更好的可行解决方案发表意见,但现在我就是这样解决问题的


所以,继续…

我有一个asp.net core 3.0应用程序,有100多个角色,没有问题。不仅仅是角色、角色和声明。在我的测试中,我只有一个角色,大约有20个角色role@MariusSteinbach,您是否愿意分享您对该问题的解决方案。我没有对asp.net.identity做过任何聪明的事情,它几乎是开箱即用。我唯一更改的是用户id从guid(字符串)更改为INT。谢谢你。你应该说这很有趣,因为在asp.net.identity之前,我曾扮演自己的安全角色,其工作方式与你描述的类似。唯一被推来推去的是一个小的ID令牌,所有这些令牌都由一些操作过滤器管理,每次你想做什么的时候都会简单地检查安全性。我和identity一样有属性,而且一切都很好。我改用了identity,因为每个人都在大肆宣扬它有多棒,而这正是我应该去gops的方式,是的,我必须修改它,因为现在它不起作用,会产生一个巨大的9块饼干。巧合的是,这可能解释了为什么该应用程序在本地GC和IE上不起作用,但在FFI上起作用。我已经在ITicketStore上查看了几天,但没有取得多大进展。我所能找到的只是不起作用的实现,我既不能隐藏也不能掩饰正在发生的事情。我甚至找不到你的指导。有趣的是,ITicket商店提供了一些关于性爱后吸烟的文章,我觉得很有趣
    public bool UserHasClaim(AppUser user, string claimValue)
    {
        var claim = (from c in _context.AppUserRoleClaims
                     join t in _context.AppUserClaimTypes on c.ClaimID equals t.ID
                     join r in _context.UserRoles on c.RoleId equals r.RoleId
                     where r.UserId == user.Id && t.ClaimValue == claimValue select c).FirstOrDefault();

        return (claim != null);
    }