Sample VSA REST API Client

Password Authentication

The two following code samples illustrate how to build a C# client that can authenticate the VSA REST API.

NOTE   The Password Authentication is deprecated and will be removed from VSA as of October 2021.

class Hash

using System;
using System.Text;
using System.Security.Cryptography;
namespace SampleVsaRestApiClient
{
    public class Hash
    {
        public string RandomNumber { get; protected set; }
        public string RawSHA256Hash { get; protected set; }
        public string CoveredSHA256Hash { get; protected set; }
        public string RawSHA1Hash { get; protected set; }
        public string CoveredSHA1Hash { get; protected set; }
        public Hash( string UserName, string Password )
        {
            RandomNumber = GenerateRandomNumber( 8 );
            RawSHA256Hash = CalculateHash( Password, "SHA-256" );
            CoveredSHA256Hash = CalculateHash( Password, UserName, "SHA-256" );
            CoveredSHA256Hash = CalculateHash( CoveredSHA256Hash, RandomNumber, "SHA-256" );
            RawSHA1Hash = CalculateHash( Password, "SHA-1" );
            CoveredSHA1Hash = CalculateHash( Password, UserName, "SHA-1" );
            CoveredSHA1Hash = CalculateHash( CoveredSHA1Hash, RandomNumber, "SHA-1" );
        }
        private string CalculateHash( string Value1, string Value2, string HashingAlgorithm )
        {
            return CalculateHash( Value1 + Value2, HashingAlgorithm );
        }
        private string CalculateHash( string Value, string HashingAlgorithm )
        {
            byte[] arrByte;
            if( HashingAlgorithm == "SHA-1" )
            {
                SHA1Managed hash = new SHA1Managed();
                arrByte = hash.ComputeHash( ASCIIEncoding.ASCII.GetBytes( Value ) );
            }
            else if( HashingAlgorithm == "SHA-256" )
            {
                SHA256Managed hash = new SHA256Managed();
                arrByte = hash.ComputeHash( ASCIIEncoding.ASCII.GetBytes( Value ) );
            }
            else
            {
                throw new ApplicationException( string.Format( "Unknow hashing algorithm: {0}", HashingAlgorithm ) );
            }
            string s = "";
            for( int i = 0; i < arrByte.Length; i++ )
            {
                s += arrByte[i].ToString( "x2" );
            }
            return s;
        }
        private string GenerateRandomNumber( int numberOfDigits )
        {
            System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
            byte[] numbers = new byte[numberOfDigits * 2];
            rng.GetNonZeroBytes( numbers );
            string result = "";
            for( int i = 0; i < numberOfDigits; i++ )
            {
                result += numbers[i].ToString();
            }
            result = result.Replace( "0", "" );
            return result.Substring( 1, numberOfDigits );
        }
    }
}

class Program

using System;
using System.Text;
using System.Net.Http;
namespace SampleVsaRestApiClient
{
    class Program
    {
        static void Main( string[] args )
        {
            string Url = @"http://myvsa.com";
            string UserName = "UserName";
            string Password = "Password";
            // Getting authenticated...
            var h = new Hash( UserName, Password );
            var headerParam = Convert.ToBase64String(
                        Encoding.Default.GetBytes(
                            string.Format( "user={0},pass2={1},pass1={2},rpass2={3},rpass1={4},rand2={5}",
                                UserName,
                                h.CoveredSHA256Hash,
                                h.CoveredSHA1Hash,
                                h.RawSHA256Hash,
                                h.RawSHA1Hash,
                                h.RandomNumber ) ) );
            using( var client = new HttpClient() )
            {
                client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue( "Basic", headerParam );
                Console.WriteLine( "Making request... " );
                var response = client.GetAsync( new Uri( string.Format( @"{0}/api/v1.0/auth", Url ) ) ).Result;
                Console.WriteLine( "StatusCode : " + (int)response.StatusCode + " " + response.StatusCode.ToString() );
                if( response.IsSuccessStatusCode )
                    Console.WriteLine( response.Content.ReadAsStringAsync().Result );
            }
        }
    }
}

Personal Token Authentication

The following code sample illustrate how to build a C# client that can authenticate the VSA REST API.

class Program 
using System; 
using System.Net.Http; 
using System.Text; 
namespace SampleVsaRestApiClient 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            string url = @"http://myvsa.com"; 
            string username = "Username"; 
            string pat = "PAT"; 
            // Getting authenticated... 
            var headerParam = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{pat}")); 
            using (var client = new HttpClient()) 
            { 
                client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", headerParam); 
                Console.WriteLine("Making request... "); 
                var response = client.GetAsync(new Uri($"{url}/api/v1.0/auth")).Result; 
                Console.WriteLine("StatusCode : " + (int)response.StatusCode + " " + response.StatusCode); 
                if (response.IsSuccessStatusCode) 
                    Console.WriteLine(response.Content.ReadAsStringAsync().Result); 
            } 
        } 
    } 
}