C# 联合身份验证-两个cookie,第一个cookie具有结束xml标记

C# 联合身份验证-两个cookie,第一个cookie具有结束xml标记,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我正在使用codeFederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(令牌)为站点创建身份验证cookie 令牌相当大,因此cookie被分成两个cookie。99%的情况下一切正常,下面是成功登录的两个cookie的一个示例,一旦它们被Base64解码: 网站作者: <?xml version="1.0" encoding="utf-8"?><SecurityContext

我正在使用code
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(令牌)为站点创建身份验证cookie

令牌相当大,因此cookie被分成两个cookie。99%的情况下一切正常,下面是成功登录的两个cookie的一个示例,一旦它们被Base64解码:

网站作者:

<?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
urn:uuid:adbfc4e1-c4a1-4882-9980-aa59431cdf48加密值
网站auth1:

ENCRYPTED_COOKIE_VALUE</Cookie></SecurityContextToken>
ENCRYPTED_COOKIE_VALUE</Cookie></SecurityContextToken>
加密的\u COOKIE\u值
但有时用户会遇到以下错误:

例外信息: 异常类型:FormatException 异常消息:输入不是有效的Base-64字符串,因为它包含非Base-64字符、两个以上的填充字符或字符串 填充字符中的非法字符。在 System.Convert.FromBase64_解码(字符*startInputPtr,Int32 inputLength,字节*startDestPtr,Int32 destLength)位于 System.Convert.FromBase64CharPtr(Char*inputPtr,Int32 inputLength)
at System.Convert.FromBase64String(字符串s)at System.IdentityModel.Services.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken)在 System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticationateRequest(对象 发件人,EventArgs(EventArgs)位于 System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤, 布尔值(同步完成(&C))

我在抛出错误时记录了用户的cookies,下面是我对cookies进行Base64解码后的样子

网站作者:

<?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>
urn:uuid:dd9a6856-9bd1-486c-9f5c-e980fbcc3b02ENCRYPTED_COOKIE_值
网站auth1:

ENCRYPTED_COOKIE_VALUE</Cookie></SecurityContextToken>
ENCRYPTED_COOKIE_VALUE</Cookie></SecurityContextToken>
加密的\u COOKIE\u值
正如您所看到的,不同之处在于第一个cookie具有关闭标记
,该标记不应该在那里,因为xml在第二个cookie中是关闭的

我认为这就是造成错误的原因


有人有过这个问题的经验吗?或者我有什么办法可以解决这个问题吗?

我的解决方案是减小cookie的大小

SessionSecurityToken上有一个名为IsReferenceMode的设置。所以我设定这是真的。这意味着cookie存储在服务器上,并且用户的计算机上只存储对此“服务器cookie”的引用。这意味着cookie要小得多,并且没有被分成两个cookie,这避免了我遇到的问题,即第一个cookie块有时随机包含结束xml标记

这种方法的缺点是,当应用程序池重新启动时,客户会丢失cookie,即使他们设置cookie应该是持久的。为了解决这个问题,我能够从SessionSecurityTokenCache类继承并重写AddOrUpdate、Get和Remove方法,将数据库用作备份存储,因此即使清除了会话,也可以检索令牌

我采用了thinktecture模型,如下所示:

这里有一个很好的博客,介绍基本知识: