微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于 asp.net core cliam 的授权抛出“HTTP 错误 400请求标头的大小太长”当设置了大量声明时

如何解决基于 asp.net core cliam 的授权抛出“HTTP 错误 400请求标头的大小太长”当设置了大量声明时

我已经在我的 asp.net core 2.1 站点中实现了声明基础授权。这是一个ERP,有很多部分。每个部分都有查看、添加、编辑、删除等权限。 假设我有 100 个部分,那么大约有 400 个声明。

角色可以拥有任何或所有声明。当用户拥有具有所有权限的角色时,即该角色的 [AspNetRoleClaims] 表中有 400 行,请说“管理员”角色。当用户说“admin”具有角色“Administrator”尝试登录时,他/她将获得

错误请求 - 请求时间过长

HTTP 错误 400。请求头的大小太长。

这是因为保存授权信息的cookie超过了浏览器支持的长度。

enter image description here

enter image description here

大约 281 行,在不久的将来添加更多模块时会增加

有什么办法可以解决这个问题。或者当我必须处理大量许可时的任何解决方法。即每个控制器操作可以有不同的授权策略。

或者我们是否可以将这些授权信息保存在数据库或会话中,而不是保存在 cookie 中。

有什么方法可以获得大量的许可,但又不使用那么多的索赔政策。

我们是否可以仅在用户浏览特定控制器/操作时强制检查声明,而不是将所有权限信息保存在 cookie 中。

任何建议都会有所帮助。谢谢

解决方法

听起来您正在使用字符串来存储权限 - 而且您拥有很多细粒度的权限。更糟糕的是,ASP.NET Core 2.x(默认情况下)将使用 the full WS-* string type name 存储 String 类型的声明(ClaimValueTypes.String == "http://www.w3.org/2001/XMLSchema/#string" 这很糟糕......我不知道如何通过代码审查,tbh)。

首先,如果每个项目(ViewAddEditDelete)始终只有 4 个布尔权限值,那么您可以将其打包恰好为 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) 但您可能会发现它作为编写自己的序列化程序的起点很有用:https://github.com/Jehoel/aspnetcore-auth-cookie-optimizations(它使我的 cookie 从 7KB 减少到 2KB)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。