asp.net 当设置大量声明时,基于核心声明的授权抛出 "HTTP Error 400. The size of the request headers is too long."
asp.net core cliam based authorization throw "HTTP Error 400. The size of the request headers is too long." when large number of claim is set
我已经在我的 asp.net 核心 2.1 站点中实施了声明基础授权。它是一个 ERP,有很多部分。每个部分都具有查看、添加、编辑、删除等权限。
假设如果我有 100 个 section ,那么大约有 400 个 claims。
角色可以拥有任何或所有声明。当具有角色的用户具有所有权限时,即 [AspNetRoleClaims] table 中的 400 行对于该角色说“管理员”角色。当用户说“admin”具有角色“Administrator”尝试登录时,he/she 将得到
请求错误 - 请求太长
HTTP 错误 400。请求的大小 headers 太长。
这是因为保存授权信息的cookie超过了浏览器支持的长度。
大约 281 行,这将在不久的将来添加更多模块时增加。
有什么办法可以解决这个问题。或者当我必须处理大量许可时的任何解决方法。即每个控制器操作可以有不同的授权策略。
或者如果我们可以将这些授权信息保存在数据库或 Session 而不是 cookie 上。
有什么方法可以获得大量许可但又不使用那么多声明策略。
我们能否仅在用户浏览特定内容时强制检查声明controller/action,而不是将所有权限信息保存在 cookie 上。
任何建议都会有所帮助。谢谢
听起来您正在使用字符串来存储权限 - 而且您有很多细粒度的权限。更糟糕的是,ASP.NET 核心 2.x(默认情况下)将存储 String
类型的声明 the full WS-*
string type name(ClaimValueTypes.String == "http://www.w3.org/2001/XMLSchema/#string"
这太糟糕了......我不不知道那是如何通过代码审查的,tbh)。
首先,如果您总是对每个项目都有 4 个布尔权限值(View
、Add
、Edit
、Delete
),那么您可以将其打包成恰好 2 位,因此您可以每个字节存储 4 个区域 - 因此 400 个区域将占用 100 个字节(假设您可以通过顺序索引识别它们 - 如果您在应用程序代码中生成映射,这是可行的)。
由于这涉及自定义票证格式,您需要:
- 子类
Microsoft.AspNetCore.Authentication.TicketSerializer
.
- 子类
Microsoft.AspNetCore.DataProtection.SecureDataFormat<AuthenticationTicket>
- 在
IPostConfigureOptions<CookieAuthenticationOptions>
中设置自定义序列化程序。
正如我在评论中所写,当我试图缩小自己的 cookie 时,我为 ASP.NET Core 编写了另一种票证格式。 It isn't suitable for secure applications when GZip compression is enabled (due to CRIME
/BREACH
) but you might find it useful as a starting-point for writing your own serializer: https://github.com/Jehoel/aspnetcore-auth-cookie-optimizations(它让我的 cookie 从 7KB 减少到 2KB)。
我已经在我的 asp.net 核心 2.1 站点中实施了声明基础授权。它是一个 ERP,有很多部分。每个部分都具有查看、添加、编辑、删除等权限。 假设如果我有 100 个 section ,那么大约有 400 个 claims。
角色可以拥有任何或所有声明。当具有角色的用户具有所有权限时,即 [AspNetRoleClaims] table 中的 400 行对于该角色说“管理员”角色。当用户说“admin”具有角色“Administrator”尝试登录时,he/she 将得到
请求错误 - 请求太长
HTTP 错误 400。请求的大小 headers 太长。
这是因为保存授权信息的cookie超过了浏览器支持的长度。
有什么办法可以解决这个问题。或者当我必须处理大量许可时的任何解决方法。即每个控制器操作可以有不同的授权策略。
或者如果我们可以将这些授权信息保存在数据库或 Session 而不是 cookie 上。
有什么方法可以获得大量许可但又不使用那么多声明策略。
我们能否仅在用户浏览特定内容时强制检查声明controller/action,而不是将所有权限信息保存在 cookie 上。
任何建议都会有所帮助。谢谢
听起来您正在使用字符串来存储权限 - 而且您有很多细粒度的权限。更糟糕的是,ASP.NET 核心 2.x(默认情况下)将存储 String
类型的声明 the full WS-*
string type name(ClaimValueTypes.String == "http://www.w3.org/2001/XMLSchema/#string"
这太糟糕了......我不不知道那是如何通过代码审查的,tbh)。
首先,如果您总是对每个项目都有 4 个布尔权限值(View
、Add
、Edit
、Delete
),那么您可以将其打包成恰好 2 位,因此您可以每个字节存储 4 个区域 - 因此 400 个区域将占用 100 个字节(假设您可以通过顺序索引识别它们 - 如果您在应用程序代码中生成映射,这是可行的)。
由于这涉及自定义票证格式,您需要:
- 子类
Microsoft.AspNetCore.Authentication.TicketSerializer
. - 子类
Microsoft.AspNetCore.DataProtection.SecureDataFormat<AuthenticationTicket>
- 在
IPostConfigureOptions<CookieAuthenticationOptions>
中设置自定义序列化程序。
正如我在评论中所写,当我试图缩小自己的 cookie 时,我为 ASP.NET Core 编写了另一种票证格式。 It isn't suitable for secure applications when GZip compression is enabled (due to CRIME
/BREACH
) but you might find it useful as a starting-point for writing your own serializer: https://github.com/Jehoel/aspnetcore-auth-cookie-optimizations(它让我的 cookie 从 7KB 减少到 2KB)。