Skip to content

Commit

Permalink
add custom header support
Browse files Browse the repository at this point in the history
  • Loading branch information
suwatch committed Dec 8, 2016
1 parent 8a10e74 commit 0fafe12
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 40 deletions.
39 changes: 26 additions & 13 deletions AADClient.Console/Program.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
Expand Down Expand Up @@ -82,45 +83,49 @@ static int Main(string[] args)
else if (String.Equals(verb, "get-tenant", StringComparison.OrdinalIgnoreCase))
{
var tenant = _parameters.Get(1, keyName: "tenant");
var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();

var path = String.Format("/{0}/tenantDetails?api-version=1.6", tenant);
var uri = EnsureAbsoluteUri(path, persistentAuthHelper);

var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null, headers).Result;
}
else if (String.Equals(verb, "get-tenant", StringComparison.OrdinalIgnoreCase))
{
var tenant = _parameters.Get(1, keyName: "tenant");
var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();

var path = String.Format("/{0}/tenantDetails/{0}?api-version=1.6", tenant);
var uri = EnsureAbsoluteUri(path, persistentAuthHelper);

var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null, headers).Result;
}
else if (String.Equals(verb, "get-apps", StringComparison.OrdinalIgnoreCase))
{
var tenant = _parameters.Get(1, keyName: "tenant");
var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();

var path = String.Format("/{0}/applications?api-version=1.6", tenant);
var uri = EnsureAbsoluteUri(path, persistentAuthHelper);

var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null, headers).Result;
}
// https://azure.microsoft.com/en-us/documentation/articles/resource-group-authenticate-service-principal/
// https://github.com/Azure-Samples/active-directory-dotnet-graphapi-console/blob/master/GraphConsoleAppV3/Program.cs
else if (String.Equals(verb, "add-app", StringComparison.OrdinalIgnoreCase))
{
var tenant = _parameters.Get(1, keyName: "tenant");
var app = _parameters.Get(2, keyName: "app");
var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();

Guid unused;
Expand All @@ -133,12 +138,13 @@ static int Main(string[] args)

var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null, headers).Result;
}
else if (String.Equals(verb, "get-app", StringComparison.OrdinalIgnoreCase))
{
var tenant = _parameters.Get(1, keyName: "tenant");
var app = _parameters.Get(2, keyName: "app");
var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();

Guid unused;
Expand All @@ -151,13 +157,14 @@ static int Main(string[] args)

var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null, headers).Result;
}
// https://msdn.microsoft.com/library/azure/ad/graph/api/entity-and-complex-type-reference#serviceprincipalentity
else if (String.Equals(verb, "get-spns", StringComparison.OrdinalIgnoreCase))
{
var tenant = _parameters.Get(1, keyName: "tenant");
var app = _parameters.Get(2, keyName: "app");
var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();

Guid appGuid = new Guid(app);
Expand All @@ -167,7 +174,7 @@ static int Main(string[] args)

var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null, headers).Result;
}
else if (String.Equals(verb, "add-cred", StringComparison.OrdinalIgnoreCase))
{
Expand Down Expand Up @@ -196,6 +203,7 @@ static int Main(string[] args)
appKey = Utils.EnsureBase64Key(appKey);
}

var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();

var appObject = GetAppObject(persistentAuthHelper, tenant, app).Result;
Expand All @@ -217,14 +225,16 @@ static int Main(string[] args)
var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;

return HttpInvoke(uri, cacheInfo, "patch", Utils.GetDefaultVerbose(), content).Result;
return HttpInvoke(uri, cacheInfo, "patch", Utils.GetDefaultVerbose(), content, headers).Result;
}
else if (String.Equals(verb, "del-cred", StringComparison.OrdinalIgnoreCase))
{
var tenant = _parameters.Get(1, keyName: "tenant");
var app = _parameters.Get(2, keyName: "app");
var keyId = _parameters.Get(3, keyName: "keyId");
EnsureGuidFormat(keyId);

var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();

var appObject = GetAppObject(persistentAuthHelper, tenant, app).Result;
Expand All @@ -237,24 +247,26 @@ static int Main(string[] args)
var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;

return HttpInvoke(uri, cacheInfo, "patch", Utils.GetDefaultVerbose(), content).Result;
return HttpInvoke(uri, cacheInfo, "patch", Utils.GetDefaultVerbose(), content, headers).Result;
}
else if (String.Equals(verb, "get-users", StringComparison.OrdinalIgnoreCase))
{
var tenant = _parameters.Get(1, keyName: "tenant");
var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();

var path = String.Format("/{0}/users?api-version=1.6", tenant);
var uri = EnsureAbsoluteUri(path, persistentAuthHelper);

var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null, headers).Result;
}
else if (String.Equals(verb, "get-user", StringComparison.OrdinalIgnoreCase))
{
var tenant = _parameters.Get(1, keyName: "tenant");
var user = _parameters.Get(2, keyName: "user");
var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();

var path = String.Format("/{0}/users/{1}?api-version=1.6", tenant, user);
Expand All @@ -266,12 +278,13 @@ static int Main(string[] args)

var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null).Result;
return HttpInvoke(uri, cacheInfo, "get", Utils.GetDefaultVerbose(), null, headers).Result;
}
else if (String.Equals(verb, "get-groups", StringComparison.OrdinalIgnoreCase))
{
var tenant = _parameters.Get(1, keyName: "tenant");
var user = _parameters.Get(2, keyName: "user");
var headers = _parameters.GetValue<Dictionary<string, List<string>>>("-h", requires: false);
_parameters.ThrowIfUnknown();


Expand All @@ -281,7 +294,7 @@ static int Main(string[] args)
var subscriptionId = GetTenantOrSubscription(uri);
TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result;
var content = new StringContent("{\"securityEnabledOnly\": false}", Encoding.UTF8, "application/json");
return HttpInvoke(uri, cacheInfo, "post", Utils.GetDefaultVerbose(), content).Result;
return HttpInvoke(uri, cacheInfo, "post", Utils.GetDefaultVerbose(), content, headers).Result;
}
else
{
Expand Down Expand Up @@ -585,10 +598,10 @@ static HttpContent ParseHttpContent(string verb, CommandLineParameters parameter
return null;
}

static async Task<int> HttpInvoke(Uri uri, TokenCacheInfo cacheInfo, string verb, bool verbose, HttpContent content)
static async Task<int> HttpInvoke(Uri uri, TokenCacheInfo cacheInfo, string verb, bool verbose, HttpContent content, Dictionary<string, List<string>> headers)
{
var logginerHandler = new HttpLoggingHandler(new HttpClientHandler(), verbose);
return await Utils.HttpInvoke(uri, cacheInfo, verb, logginerHandler, content);
return await Utils.HttpInvoke(uri, cacheInfo, verb, logginerHandler, content, headers);
}

//http://stackoverflow.com/questions/4810841/how-can-i-pretty-print-json-using-javascript
Expand Down
56 changes: 43 additions & 13 deletions ARMClient.Authentication/Utilities/Utils.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
using ARMClient.Authentication.AADAuthentication;
using ARMClient.Authentication.Contracts;
using System;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using ARMClient.Authentication.AADAuthentication;
using ARMClient.Authentication.Contracts;
using Newtonsoft.Json.Linq;

namespace ARMClient.Authentication.Utilities
Expand Down Expand Up @@ -94,35 +96,37 @@ public override void WriteLine(string message)
}
}

public static async Task<int> HttpInvoke(Uri uri, TokenCacheInfo cacheInfo, string verb, DelegatingHandler handler, HttpContent content)
public static async Task<int> HttpInvoke(Uri uri, TokenCacheInfo cacheInfo, string verb, DelegatingHandler handler, HttpContent content, Dictionary<string, List<string>> headers = null)
{
using (var client = new HttpClient(handler))
{
client.DefaultRequestHeaders.Add("Authorization", cacheInfo.CreateAuthorizationHeader());
client.DefaultRequestHeaders.Add("User-Agent", Constants.UserAgent.Value);
client.DefaultRequestHeaders.Add("Accept", Constants.JsonContentType);
client.DefaultRequestHeaders.Add("Authorization", cacheInfo.CreateAuthorizationHeader(), headers);
client.DefaultRequestHeaders.Add("User-Agent", Constants.UserAgent.Value, headers);
client.DefaultRequestHeaders.Add("Accept", Constants.JsonContentType, headers);

if (Utils.IsRdfe(uri))
{
client.DefaultRequestHeaders.Add("x-ms-version", "2013-10-01");
client.DefaultRequestHeaders.Add("x-ms-version", "2013-10-01", headers);
}

if (Utils.IsCSM(uri))
{
var stamp = GetDefaultStamp();
if (!String.IsNullOrEmpty(stamp))
{
client.DefaultRequestHeaders.Add("x-geoproxy-stamp", stamp);
client.DefaultRequestHeaders.Add("x-geoproxy-stamp", stamp, headers);
}

var stampCert = GetDefaultStampCert();
if (!String.IsNullOrEmpty(stampCert))
{
client.DefaultRequestHeaders.Add("x-geoproxy-stampcert", stampCert);
client.DefaultRequestHeaders.Add("x-geoproxy-stampcert", stampCert, headers);
}
}

client.DefaultRequestHeaders.Add("x-ms-request-id", Guid.NewGuid().ToString());
client.DefaultRequestHeaders.Add("x-ms-request-id", Guid.NewGuid().ToString(), headers);

client.DefaultRequestHeaders.AddRemainingHeaders(headers);

HttpResponseMessage response = null;
if (String.Equals(verb, "get", StringComparison.OrdinalIgnoreCase))
Expand Down Expand Up @@ -166,6 +170,32 @@ public static async Task<int> HttpInvoke(Uri uri, TokenCacheInfo cacheInfo, stri
}
}

private static void Add(this HttpRequestHeaders requestHeaders, string name, string value, Dictionary<string, List<string>> headers)
{
List<string> values;
if (headers != null && headers.TryGetValue(name, out values))
{
requestHeaders.Add(name, values);
headers.Remove(name);
}
else
{
requestHeaders.Add(name, value);
}
}

private static void AddRemainingHeaders(this HttpRequestHeaders requestHeaders, Dictionary<string, List<string>> headers)
{
if (headers != null)
{
foreach (var pair in headers)
{
requestHeaders.Add(pair.Key, pair.Value);
}
headers.Clear();
}
}

public static async Task<JObject> HttpGet(Uri uri, TokenCacheInfo cacheInfo)
{
using (var client = new HttpClient())
Expand Down
Loading

0 comments on commit 0fafe12

Please sign in to comment.