public static string UsingWebEncoders(string input) { byte[] inputBytes = null; char[] outputChars = null; try { var minimumLength = Encoding.UTF8.GetByteCount(input); inputBytes = ArrayPool <byte> .Shared.Rent(minimumLength); int inputBytesCount = Encoding.UTF8.GetBytes(input, 0, input.Length, inputBytes, 0); var outputSize = WebEncoders.GetArraySizeRequiredToEncode(inputBytesCount); outputChars = ArrayPool <char> .Shared.Rent(outputSize); var charsSize = WebEncoders.Base64UrlEncode(inputBytes, 0, outputChars, 0, inputBytesCount); return(new string(outputChars, 0, charsSize)); } finally { if (inputBytes != null) { ArrayPool <byte> .Shared.Return(inputBytes); } if (outputChars != null) { ArrayPool <char> .Shared.Return(outputChars); } } }
public string Serialize(AntiforgeryToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } var serializationContext = _pool.Get(); try { var writer = serializationContext.Writer; writer.Write(TokenVersion); writer.Write(token.SecurityToken !.GetData()); writer.Write(token.IsCookieToken); if (!token.IsCookieToken) { if (token.ClaimUid != null) { writer.Write(true /* isClaimsBased */); writer.Write(token.ClaimUid.GetData()); } else { writer.Write(false /* isClaimsBased */); writer.Write(token.Username !); } writer.Write(token.AdditionalData); } writer.Flush(); var stream = serializationContext.Stream; var bytes = _cryptoSystem.Protect(stream.ToArray()); var count = bytes.Length; var charsRequired = WebEncoders.GetArraySizeRequiredToEncode(count); var chars = serializationContext.GetChars(charsRequired); var outputLength = WebEncoders.Base64UrlEncode( bytes, offset: 0, output: chars, outputOffset: 0, count: count); return(new string(chars, startIndex : 0, length : outputLength)); } finally { _pool.Return(serializationContext); } }