-
我有一个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标识资源的同时做到这一点呢?
-
我怎样才能保证
索赔
值是否有效序列化?
-
如何防止像
访问令牌
和
身份证
价值观?