/// <summary> /// Initializes from a <see cref="BinaryReader"/>. Normally the reader is initialized in the same as the one passed to <see cref="Serialize(BinaryWriter)"/> /// </summary> /// <param name="reader">a <see cref="BinaryReader"/> pointing to a <see cref="ClaimsIdentity"/>.</param> /// <exception cref="ArgumentNullException">if 'reader' is null.</exception> private void Initialize(BinaryReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } // SerializationMask mask = (SerializationMask)reader.ReadInt32(); if ((mask & SerializationMask.AuthenticationType) == SerializationMask.AuthenticationType) { m_authenticationType = reader.ReadString(); } if ((mask & SerializationMask.BootstrapConext) == SerializationMask.BootstrapConext) { m_bootstrapContext = reader.ReadString(); } if ((mask & SerializationMask.NameClaimType) == SerializationMask.NameClaimType) { m_nameType = reader.ReadString(); } else { m_nameType = ClaimsIdentity.DefaultNameClaimType; } if ((mask & SerializationMask.RoleClaimType) == SerializationMask.RoleClaimType) { m_roleType = reader.ReadString(); } else { m_roleType = ClaimsIdentity.DefaultRoleClaimType; } if ((mask & SerializationMask.HasClaims) == SerializationMask.HasClaims) { // int numberOfClaims = reader.ReadInt32(); for (int index = 0; index < numberOfClaims; ++index) { Claim claim = new Claim(reader, this); m_instanceClaims.Add(claim); } } }
/// <summary> /// Initializes an instance of <see cref="Claim"/> using a <see cref="BinaryReader"/>. /// Normally the <see cref="BinaryReader"/> is constructed using the bytes from <see cref="WriteTo(BinaryWriter)"/> and initialized in the same way as the <see cref="BinaryWriter"/>. /// </summary> /// <param name="reader">a <see cref="BinaryReader"/> pointing to a <see cref="Claim"/>.</param> /// <param name="subject"> the value for <see cref="Claim.Subject"/>, which is the <see cref="ClaimsIdentity"/> that has these claims.</param> /// <exception cref="ArgumentNullException">if 'reader' is null.</exception> public Claim(BinaryReader reader, ClaimsIdentity subject) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } _subject = subject; SerializationMask mask = (SerializationMask)reader.ReadInt32(); int numPropertiesRead = 1; int numPropertiesToRead = reader.ReadInt32(); _value = reader.ReadString(); if ((mask & SerializationMask.NameClaimType) == SerializationMask.NameClaimType) { _type = ClaimsIdentity.DefaultNameClaimType; } else if ((mask & SerializationMask.RoleClaimType) == SerializationMask.RoleClaimType) { _type = ClaimsIdentity.DefaultRoleClaimType; } else { _type = reader.ReadString(); numPropertiesRead++; } if ((mask & SerializationMask.StringType) == SerializationMask.StringType) { _valueType = reader.ReadString(); numPropertiesRead++; } else { _valueType = ClaimValueTypes.String; } if ((mask & SerializationMask.Issuer) == SerializationMask.Issuer) { _issuer = reader.ReadString(); numPropertiesRead++; } else { _issuer = ClaimsIdentity.DefaultIssuer; } if ((mask & SerializationMask.OriginalIssuerEqualsIssuer) == SerializationMask.OriginalIssuerEqualsIssuer) { _originalIssuer = _issuer; } else if ((mask & SerializationMask.OriginalIssuer) == SerializationMask.OriginalIssuer) { _originalIssuer = reader.ReadString(); numPropertiesRead++; } else { _originalIssuer = ClaimsIdentity.DefaultIssuer; } if ((mask & SerializationMask.HasProperties) == SerializationMask.HasProperties) { int numProperties = reader.ReadInt32(); numPropertiesRead++; for (int i = 0; i < numProperties; i++) { Properties.Add(reader.ReadString(), reader.ReadString()); } } if ((mask & SerializationMask.UserData) == SerializationMask.UserData) { int cb = reader.ReadInt32(); _userSerializationData = reader.ReadBytes(cb); numPropertiesRead++; } for (int i = numPropertiesRead; i < numPropertiesToRead; i++) { reader.ReadString(); } }
/// <summary> /// Serializes using a <see cref="BinaryWriter"/> /// </summary> /// <param name="writer">the <see cref="BinaryWriter"/> to use for data storage.</param> /// <param name="userData">additional data provided by derived type.</param> /// <exception cref="ArgumentNullException">if 'writer' is null.</exception> protected virtual void WriteTo(BinaryWriter writer, byte[] userData) { if (writer == null) { throw new ArgumentNullException(nameof(writer)); } int numberOfPropertiesWritten = 1; SerializationMask mask = SerializationMask.None; if (string.Equals(_type, ClaimsIdentity.DefaultNameClaimType)) { mask |= SerializationMask.NameClaimType; } else if (string.Equals(_type, ClaimsIdentity.DefaultRoleClaimType)) { mask |= SerializationMask.RoleClaimType; } else { numberOfPropertiesWritten++; } if (!string.Equals(_valueType, ClaimValueTypes.String, StringComparison.Ordinal)) { numberOfPropertiesWritten++; mask |= SerializationMask.StringType; } if (!string.Equals(_issuer, ClaimsIdentity.DefaultIssuer, StringComparison.Ordinal)) { numberOfPropertiesWritten++; mask |= SerializationMask.Issuer; } if (string.Equals(_originalIssuer, _issuer, StringComparison.Ordinal)) { mask |= SerializationMask.OriginalIssuerEqualsIssuer; } else if (!string.Equals(_originalIssuer, ClaimsIdentity.DefaultIssuer)) { numberOfPropertiesWritten++; mask |= SerializationMask.OriginalIssuer; } if (_properties != null && _properties.Count > 0) { numberOfPropertiesWritten++; mask |= SerializationMask.HasProperties; } if (userData != null && userData.Length > 0) { numberOfPropertiesWritten++; mask |= SerializationMask.UserData; } writer.Write((int)mask); writer.Write(numberOfPropertiesWritten); writer.Write(_value); if (((mask & SerializationMask.NameClaimType) != SerializationMask.NameClaimType) && ((mask & SerializationMask.RoleClaimType) != SerializationMask.RoleClaimType)) { writer.Write(_type); } if ((mask & SerializationMask.StringType) == SerializationMask.StringType) { writer.Write(_valueType); } if ((mask & SerializationMask.Issuer) == SerializationMask.Issuer) { writer.Write(_issuer); } if ((mask & SerializationMask.OriginalIssuer) == SerializationMask.OriginalIssuer) { writer.Write(_originalIssuer); } if ((mask & SerializationMask.HasProperties) == SerializationMask.HasProperties) { writer.Write(_properties.Count); foreach (var kvp in _properties) { writer.Write(kvp.Key); writer.Write(kvp.Value); } } if ((mask & SerializationMask.UserData) == SerializationMask.UserData) { writer.Write(userData.Length); writer.Write(userData); } writer.Flush(); }
/// <summary> /// Initializes from a <see cref="BinaryReader"/>. Normally the reader is initialized with the results from <see cref="WriteTo(BinaryWriter)"/> /// Normally the <see cref="BinaryReader"/> is initialized in the same way as the <see cref="BinaryWriter"/> passed to <see cref="WriteTo(BinaryWriter)"/>. /// </summary> /// <param name="reader">a <see cref="BinaryReader"/> pointing to a <see cref="ClaimsIdentity"/>.</param> /// <exception cref="ArgumentNullException">if 'reader' is null.</exception> private void Initialize(BinaryReader reader) { ArgumentNullException.ThrowIfNull(reader); SerializationMask mask = (SerializationMask)reader.ReadInt32(); int numPropertiesRead = 0; int numPropertiesToRead = reader.ReadInt32(); if ((mask & SerializationMask.AuthenticationType) == SerializationMask.AuthenticationType) { _authenticationType = reader.ReadString(); numPropertiesRead++; } if ((mask & SerializationMask.BootstrapConext) == SerializationMask.BootstrapConext) { _bootstrapContext = reader.ReadString(); numPropertiesRead++; } if ((mask & SerializationMask.NameClaimType) == SerializationMask.NameClaimType) { _nameClaimType = reader.ReadString(); numPropertiesRead++; } else { _nameClaimType = ClaimsIdentity.DefaultNameClaimType; } if ((mask & SerializationMask.RoleClaimType) == SerializationMask.RoleClaimType) { _roleClaimType = reader.ReadString(); numPropertiesRead++; } else { _roleClaimType = ClaimsIdentity.DefaultRoleClaimType; } if ((mask & SerializationMask.HasLabel) == SerializationMask.HasLabel) { _label = reader.ReadString(); numPropertiesRead++; } if ((mask & SerializationMask.HasClaims) == SerializationMask.HasClaims) { int numberOfClaims = reader.ReadInt32(); for (int index = 0; index < numberOfClaims; index++) { _instanceClaims.Add(CreateClaim(reader)); } numPropertiesRead++; } if ((mask & SerializationMask.Actor) == SerializationMask.Actor) { _actor = new ClaimsIdentity(reader); numPropertiesRead++; } if ((mask & SerializationMask.UserData) == SerializationMask.UserData) { int cb = reader.ReadInt32(); _userSerializationData = reader.ReadBytes(cb); numPropertiesRead++; } for (int i = numPropertiesRead; i < numPropertiesToRead; i++) { reader.ReadString(); } }
/// <summary> /// Serializes using a <see cref="BinaryWriter"/> /// </summary> /// <param name="writer">the <see cref="BinaryWriter"/> to use for data storage.</param> /// <param name="userData">additional data provided by derived type.</param> /// <exception cref="ArgumentNullException">if 'writer' is null.</exception> protected virtual void WriteTo(BinaryWriter writer, byte[] userData) { if (writer == null) { throw new ArgumentNullException("writer"); } // TODO - brentsch, given that there may be a bunch of NameClaims and or RoleClaims, we should account for this. // This would require coordination between ClaimsIdentity and Claim since the ClaimsIdentity defines these 'types'. For now just use defaults. int numberOfPropertiesWritten = 1; SerializationMask mask = SerializationMask.None; if (string.Equals(_type, ClaimsIdentity.DefaultNameClaimType)) { mask |= SerializationMask.NameClaimType; } else if (string.Equals(_type, ClaimsIdentity.DefaultRoleClaimType)) { mask |= SerializationMask.RoleClaimType; } else { numberOfPropertiesWritten++; } if (!string.Equals(_valueType, ClaimValueTypes.String, StringComparison.Ordinal)) { numberOfPropertiesWritten++; mask |= SerializationMask.StringType; } if (!string.Equals(_issuer, ClaimsIdentity.DefaultIssuer, StringComparison.Ordinal)) { numberOfPropertiesWritten++; mask |= SerializationMask.Issuer; } if (string.Equals(_originalIssuer, _issuer, StringComparison.Ordinal)) { mask |= SerializationMask.OriginalIssuerEqualsIssuer; } else if (!string.Equals(_originalIssuer, ClaimsIdentity.DefaultIssuer, StringComparison.Ordinal)) { numberOfPropertiesWritten++; mask |= SerializationMask.OriginalIssuer; } if (Properties.Count > 0) { numberOfPropertiesWritten++; mask |= SerializationMask.HasProperties; } // TODO - brentschmaltz - maximum size ?? if (userData != null && userData.Length > 0) { numberOfPropertiesWritten++; mask |= SerializationMask.UserData; } writer.Write((Int32)mask); writer.Write((Int32)numberOfPropertiesWritten); writer.Write(_value); if (((mask & SerializationMask.NameClaimType) != SerializationMask.NameClaimType) && ((mask & SerializationMask.RoleClaimType) != SerializationMask.RoleClaimType)) { writer.Write(_type); } if ((mask & SerializationMask.StringType) == SerializationMask.StringType) { writer.Write(_valueType); } if ((mask & SerializationMask.Issuer) == SerializationMask.Issuer) { writer.Write(_issuer); } if ((mask & SerializationMask.OriginalIssuer) == SerializationMask.OriginalIssuer) { writer.Write(_originalIssuer); } if ((mask & SerializationMask.HasProperties) == SerializationMask.HasProperties) { writer.Write(Properties.Count); foreach (var key in Properties.Keys) { writer.Write(key); writer.Write(Properties[key]); } } if ((mask & SerializationMask.UserData) == SerializationMask.UserData) { writer.Write((Int32)userData.Length); writer.Write(userData); } writer.Flush(); }