联合身份验证-两个cookie,第一个cookie具有结束xml标记
本文关键字:cookie 结束 xml 标记 身份验证 -两个 第一个 | 更新日期: 2023-09-27 17:57:48
我正在使用代码FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(token);
为站点创建身份验证cookie
代币相当大,因此cookie分为两个cookie。99%的情况下,一切都能正常工作,下面是一个成功登录的两个cookie的例子,一旦它们被Base64解码:
WebSiteAuth:
<?xml version="1.0" encoding="utf-8"?><SecurityContextTokenp1:Id="_e00ce4ab-> 2439-48d3-a1cd-f6a31180d02f-B99934A3DBEDB9B3EA191AB595FA8011" xmlns:p1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512"><Identifier>urn:uuid:adbfc4e1-c4a1-4882-9980-aa59431cdf48</Identifier><Cookie xmlns="http://schemas.microsoft.com/ws/2006/05/security">ENCRYPTED_COOKIE_VALUE
WebSiteAuth1:
ENCRYPTED_COOKIE_VALUE</Cookie></SecurityContextToken>
但有时用户会遇到以下错误:
异常信息:异常类型:FormatException异常消息:输入不是有效的Base-64字符串,因为它包含非Base-64字符、两个以上的填充字符或填充字符中的非法字符。在System.Convert.FromBase64_Decode(Char*startInputPtr,Int32inputLength,Byte*startDestPtr,Int32 destLength)System.Convert.FromBase64CharPtr(Char*inputPtr,Int32 inputLength)
位于System.Convert.FromBase64String(字符串s)System.IdentityModel.Services.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken&sessionToken)System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(对象发件人,EventArgs EventArgs)System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔运算&完成同步)
我在抛出错误时记录了用户的cookie,以下是Base64解码后的cookie。
WebSiteAuth:
<?xml version="1.0" encoding="utf-8"?><SecurityContextToken p1:Id="_3518f851-bbec-4bb3-b7bb-c4c9bd9165e2-978AD0895E2683747B7CAFF4F1C7131B" xmlns:p1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512"><Identifier>urn:uuid:dd9a6856-9bd1-486c-9f5c-e980fbcc3b02</Identifier><Cookie xmlns="http://schemas.microsoft.com/ws/2006/05/security">ENCRYPTED_COOKIE_VALUE</Cookie></SecurityContextToken>
WebSiteAuth1:
ENCRYPTED_COOKIE_VALUE</Cookie></SecurityContextToken>
正如您所看到的,不同之处在于第一个cookie具有不应该存在的结束标记</Cookie></SecurityContextToken>
,因为xml在第二个cookie中是关闭的。
我认为这就是造成错误的原因。
有人经历过这个问题吗?或者我有什么办法解决这个问题吗?
我的解决方案是缩小cookie的大小。
SessionSecurityToken上有一个名为IsReferenceMode的设置。所以我设定这是真的。这意味着cookie存储在服务器上,并且只有对该"服务器cookie"的引用存储在用户的机器上。这意味着cookie要小得多,并且没有分为两个cookie,这避免了我遇到的问题,即第一个cookie块有时随机包含关闭xml标记。
这种方法的缺点是,当应用程序池重新启动时,客户会丢失他们的cookie,即使他们设置cookie应该是持久的。为了解决这个问题,我能够从SessionSecurityTokenCache类继承并重写AddOrUpdate、Get和Remove方法,将数据库用作备份存储,因此即使会话被清除,也可以检索令牌。
我调整了思维结构模型,它在这里:https://github.com/identitymodel/Thinktecture.IdentityModel
这里有一个很好的博客来解释基本原理:https://brockallen.com/2013/02/21/server-side-session-token-caching-in-wif-and-thinktecture-identitymodel/