代码之家  ›  专栏  ›  技术社区  ›  Dai

如何控制ASP.NET核心Cookie身份验证的声明、票证和属性的序列化?

  •  0
  • Dai  · 技术社区  · 5 年前
    • 我有一个ASP.NET Core 2.2mvc web应用程序,它使用来自一个单独网站的OIDC。
    • Startup.cs ,它有:

      services
          .AddAuthentication()
          .AddCookie( "Cookies", o => ... )
          .AddOpenIdConnect( "Oidc",  o => ... );
      
    • 这个 access_token 来自ID提供者的大约是800字节 id_token 大约是1500字节。

    • 身份证 被检索,我的代码解析所有 身份证 声明并将其转换为强类型C#对象属性,然后生成 List<Claim> 基于这些特性。这个 列表<索赔> 然后传递到ASP.NET核心的 SignInAsync 方法。
    • 但是,发出的ASP.NET核心cookie通常超过7000字节(!!)而且它太大了,可以分布在2到3个cookies上(使用ASP.NET Core的分块cookies功能)。这会导致一个问题,因为Chrome有时会拒绝超过4096字节的cookie。
    • 我用了这个把戏( https://stackoverflow.com/a/55729188/159145 )要将分块的cookies转换为一个二进制文件,我使用十六进制编辑器进行检查,并查看空间的使用情况:
      • 每一个 Claim 我的项目 列表<索赔> 已序列化(如预期),但每个 索赔 ClaimValueType 还使用完整的颁发者URI(23字节)和完整的XML数据类型URI序列化,例如。 "http://www.w3.org/2001/XMLSchema#integer" "http://www.w3.org/2001/XMLSchema#string" -很不幸,因为我用 integer 首先是节省字符串编码和引号的空间。
        • 加起来,它们都使用了7000字节cookie中的1900字节。
      • 接下来,存储各种OIDC值,例如 AuthScheme.oidc\r.sessionState .Token.access_token” . 我注意到这些值已经被Base64编码,然后被ASP.NET Core双重编码。(因此,如果ASP.NET内核更聪明,它将取消对任何Base64值的编码,并将其表示为原始二进制形式,然后将其传递到数据保护(加密)中,然后运行outer-Base64,但我偏离了方向。
      • 在那之后 .Token.id_token 是冗余存储的。这是多余的,因为 身份证 的声明已被解析为 ClaimsIdentity -但是没有选择 AddOpenIdConnect 只保存 访问令牌 进入用户的cookie并将 身份证 .
        • 实际上 身份证 必须保存,因为需要使用OIDC注销 hint 特征(原始 身份证 字符串必须原封不动地提供回IP)。

    我看到了一些优化这一点的可能性,但很少有关于如何实现这一点的在线文档。

    • 我能不能阻止 索赔 值被序列化,并使ASP.NET Core具体化 索赔 通过重新解析 身份证 ?
    • 我可以让ASP.NET Core使用用户信息端点来声明,而不是使用 身份证 ,但如何在确保获得所需的所有OpenID标识资源的同时做到这一点呢?
    • 我怎样才能保证 索赔 值是否有效序列化?
    • 如何防止像 访问令牌 身份证 价值观?
    0 回复  |  直到 5 年前