/// <summary> /// Called to serialize this context. /// </summary> /// <param name="info"><see cref="SerializationInfo"/> container for storing data. Cannot be null.</param> /// <param name="context"><see cref="StreamingContext"/> contains the context for streaming and optionally additional user data.</param> /// <exception cref="ArgumentNullException"> thrown if 'info' is null.</exception> public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { if (_tokenBytes != null) { info.AddValue(_tokenTypeKey, _byteTokenType); info.AddValue(_tokenKey, _tokenBytes); } else if (_tokenString != null) { info.AddValue(_tokenTypeKey, _stringTokenType); info.AddValue(_tokenKey, _tokenString); } else if (_token != null && _tokenHandler != null) { using (MemoryStream ms = new MemoryStream()) { info.AddValue(_tokenTypeKey, _securityTokenType); using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(ms, Text.Encoding.UTF8, false)) { _tokenHandler.WriteToken(writer, _token); writer.Flush(); info.AddValue(_tokenKey, Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length)); } } } }
/// <summary> /// Writes a <see cref="EncryptedSecurityToken"/> using the xmlWriter. /// </summary> /// <param name="writer">The XmlWriter to which the encrypted token is written.</param> /// <param name="token">The <see cref="SecurityToken"/> which must be an instance of <see cref="EncryptedSecurityToken"/>.</param> /// <exception cref="ArgumentNullException">The input prameter 'writer' is null.</exception> /// <exception cref="ArgumentNullException">The input prameter 'token' is null.</exception> /// <exception cref="ArgumentException">The <see cref="SecurityToken"/> is not an instance of <see cref="EncryptedSecurityToken"/>.</exception> /// <exception cref="InvalidOperationException">The property 'Configuration' is null. This property is required for obtaining keys for encryption.</exception> /// <exception cref="InvalidOperationException">The ContaingCollection was unable to find a <see cref="SecurityTokenHandler"/> that is able to write /// the <see cref="SecurityToken"/> returned by 'EncryptedSecurityToken.Token'.</exception> /// <exception cref="SecurityTokenException">The property 'EncryptinCredentials.SecurityKey is not a <see cref="SymmetricSecurityKey"/></exception> public override void WriteToken(XmlWriter writer, SecurityToken token) { if (null == writer) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("writer"); } if (null == token) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token"); } EncryptedSecurityToken encryptedToken = token as EncryptedSecurityToken; if (null == encryptedToken) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("token", SR.GetString(SR.ID4024)); } if (this.ContainingCollection == null) { throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID4279)); } // // This implementation simply wraps the token in xenc:EncryptedData // EncryptedDataElement encryptedData = new EncryptedDataElement(KeyInfoSerializer); using (MemoryStream plaintextStream = new MemoryStream()) { // // Buffer the plaintext // using (XmlDictionaryWriter plaintextWriter = XmlDictionaryWriter.CreateTextWriter(plaintextStream, Encoding.UTF8, false)) { SecurityTokenHandler securityTokenHandler = this.ContainingCollection[encryptedToken.Token.GetType()]; if (securityTokenHandler != null) { securityTokenHandler.WriteToken(plaintextWriter, encryptedToken.Token); } else { throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID4224, encryptedToken.Token.GetType())); } } // // Set up the EncryptedData element // EncryptingCredentials encryptingCredentials = encryptedToken.EncryptingCredentials; encryptedData.Type = XmlEncryptionConstants.EncryptedDataTypes.Element; encryptedData.KeyIdentifier = encryptingCredentials.SecurityKeyIdentifier; encryptedData.Algorithm = encryptingCredentials.Algorithm; // // Get the encryption key, which must be symmetric // SymmetricSecurityKey encryptingKey = encryptingCredentials.SecurityKey as SymmetricSecurityKey; if (encryptingKey == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityTokenException(SR.GetString(SR.ID3064))); } // // Do the actual encryption // using (SymmetricAlgorithm symmetricAlgorithm = encryptingKey.GetSymmetricAlgorithm(encryptingCredentials.Algorithm)) { byte[] plainTextBytes = plaintextStream.GetBuffer(); DebugEncryptedTokenClearText(plainTextBytes, Encoding.UTF8); encryptedData.Encrypt(symmetricAlgorithm, plainTextBytes, 0, (int)plaintextStream.Length); } } // // Write the EncryptedData element // encryptedData.WriteXml(writer, KeyInfoSerializer); }
private void RunWriteXmlWriterVariation(XmlWriter writer, SecurityToken token, SecurityTokenHandler tokenHandler, ExpectedException ee) { try { tokenHandler.WriteToken(writer, token); ee.ProcessNoException(); } catch(Exception ex) { ee.ProcessException(ex); } }
public static string CreateToken(SecurityTokenDescriptor securityTokenDescriptor, SecurityTokenHandler tokenHandler) { SecurityToken securityToken = tokenHandler.CreateToken(securityTokenDescriptor); StringBuilder sb = new StringBuilder(); XmlWriter writer = XmlWriter.Create(sb); tokenHandler.WriteToken(writer, securityToken); writer.Flush(); writer.Close(); return sb.ToString(); }
public static string CreateJwtToken(SecurityTokenDescriptor securityTokenDescriptor, SecurityTokenHandler tokenHandler) { return tokenHandler.WriteToken(tokenHandler.CreateToken(securityTokenDescriptor)); }