0

мне нужна помощь, чтобы выяснить, почему BinaryFormatter не десериализации идентичности:Почему BinaryFormatter не может десериализации свой собственный результат

var identities = new[] 
        { 
         new ClaimsIdentity("Bug") 
          { 
           Actor = new ClaimsIdentity("Bootstrap Context as a string") 
             { 
              BootstrapContext = "this causes issue" 
             }, 

           BootstrapContext = new BootstrapContext("this raw token") 
          } 
        }; 

var sessionToken = new SessionSecurityToken(new ClaimsPrincipal(identities)); 
byte[] buffer; 
using (var ms = new MemoryStream()) 
{ 
    var formatter = new BinaryFormatter(); 
    formatter.Serialize(ms, sessionToken); 
    buffer = ms.ToArray(); 
} 

using (var ms = new MemoryStream(buffer)) 
{ 
    var formatter = new BinaryFormatter(); 
    sessionToken = (SessionSecurityToken)formatter.Deserialize(ms); 
} 

Это вызывает TargetInvocationException исключение с внутренним сообщением:

«Не удалось привести объект типа ' System.String 'для ввода' System.IdentityModel.Tokens.BootstrapContext '. " Я не могу отлаживать Framework, чтобы выяснить его самостоятельно, поэтому я прошу вас помочь выяснить корень этого неожиданного поведения.

ответ

3

BootstrapContext Недвижимость в ClaimsIdentity имеет тип Object. Это означает, что вы можете назначить ему строку (как и вы). Тем не менее, reading the documentation вы можете видеть, что на самом деле это должен быть объект BootstrapContext, который, вероятно, ожидается при десериализации.

+0

Итак, свойство принимает System.Object, но всегда должно быть экземпляром BootstrapContext, если мы предполагаем использование сериализации? –

+0

@DmitriySosunov Да, вот как я его интерпретирую. Я бы сказал, что он должен _ всегда быть экземпляром «BootstrapContext», независимо от того, используется ли сериализация или нет. –

+0

Спасибо, я отправил свои комментарии Vittori (автор System.IdentityModel.Tokens.Jwt). Я нашел эту проблему при работе с токенами ActAs и токенами JWT, и там Vottiry сохраняет контекст в виде строки. –