static void EnsureTokenCache(PersistentAuthHelper persistentAuthHelper) { if (!persistentAuthHelper.IsCacheValid()) { throw new CommandLineException("There is no login token. Please login to acquire token."); } }
static int Main(string[] args) { Utils.SetTraceListener(new ConsoleTraceListener()); try { var persistentAuthHelper = new PersistentAuthHelper(); if (args.Length > 0) { var _parameters = new CommandLineParameters(args); var verb = _parameters.Get(0, "verb"); if (String.Equals(verb, "login", StringComparison.OrdinalIgnoreCase)) { var env = _parameters.Get(1, requires: false); _parameters.ThrowIfUnknown(); persistentAuthHelper.AzureEnvironments = env == null ? Utils.GetDefaultEnv() : (AzureEnvironments)Enum.Parse(typeof(AzureEnvironments), args[1], ignoreCase: true); persistentAuthHelper.AcquireTokens().Wait(); return 0; } else if (String.Equals(verb, "listcache", StringComparison.OrdinalIgnoreCase)) { _parameters.ThrowIfUnknown(); EnsureTokenCache(persistentAuthHelper); foreach (var line in persistentAuthHelper.DumpTokenCache()) { Console.WriteLine(line); } return 0; } else if (String.Equals(verb, "clearcache", StringComparison.OrdinalIgnoreCase)) { _parameters.ThrowIfUnknown(); persistentAuthHelper.ClearTokenCache(); return 0; } else if (String.Equals(verb, "token", StringComparison.OrdinalIgnoreCase)) { var tenantId = _parameters.Get(1, requires: false); _parameters.ThrowIfUnknown(); if (tenantId != null && tenantId.StartsWith("ey")) { DumpClaims(tenantId); return 0; } EnsureTokenCache(persistentAuthHelper); persistentAuthHelper.AzureEnvironments = Utils.GetDefaultEnv(); TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(tenantId).Result; var bearer = cacheInfo.CreateAuthorizationHeader(); Clipboard.SetText(bearer); DumpClaims(cacheInfo.AccessToken); Console.WriteLine(); Console.WriteLine("Token copied to clipboard successfully."); return 0; } else if (String.Equals(verb, "spn", StringComparison.OrdinalIgnoreCase)) { var tenantId = _parameters.Get(1, keyName: "tenant"); var appId = _parameters.Get(2, keyName: "appId"); EnsureGuidFormat(appId); X509Certificate2 certificate = null; var appKey = _parameters.Get(3, keyName: "appKey", requires: false); if (appKey == null) { appKey = PromptForPassword("appKey"); } else { if (File.Exists(appKey)) { var password = _parameters.Get(4, keyName: "password", requires: false); if (password == null) { password = PromptForPassword("password"); } certificate = new X509Certificate2(appKey, password); } } if (certificate == null) { appKey = Utils.EnsureBase64Key(appKey); } _parameters.ThrowIfUnknown(); persistentAuthHelper.AzureEnvironments = Utils.GetDefaultEnv(); var cacheInfo = certificate != null ? persistentAuthHelper.GetTokenBySpn(tenantId, appId, certificate).Result : persistentAuthHelper.GetTokenBySpn(tenantId, appId, appKey).Result; return 0; } else if (String.Equals(verb, "upn", StringComparison.OrdinalIgnoreCase)) { var username = _parameters.Get(1, keyName: "username"); var password = _parameters.Get(2, keyName: "password", requires: false); if (password == null) { password = PromptForPassword("password"); } _parameters.ThrowIfUnknown(); persistentAuthHelper.AzureEnvironments = Utils.GetDefaultEnv(); var cacheInfo = persistentAuthHelper.GetTokenByUpn(username, password).Result; return 0; } else if (String.Equals(verb, "get", StringComparison.OrdinalIgnoreCase) || String.Equals(verb, "delete", StringComparison.OrdinalIgnoreCase) || String.Equals(verb, "put", StringComparison.OrdinalIgnoreCase) || String.Equals(verb, "post", StringComparison.OrdinalIgnoreCase) || String.Equals(verb, "patch", StringComparison.OrdinalIgnoreCase)) { var path = _parameters.Get(1, keyName: "url"); var verbose = _parameters.Get("-verbose", requires: false) != null || Utils.GetDefaultVerbose(); if (!verbose) { Trace.Listeners.Clear(); } var uri = EnsureAbsoluteUri(path, persistentAuthHelper); var env = GetAzureEnvironments(uri, persistentAuthHelper); if (!persistentAuthHelper.IsCacheValid() || persistentAuthHelper.AzureEnvironments != env) { persistentAuthHelper.AzureEnvironments = env; persistentAuthHelper.AcquireTokens().Wait(); } var content = ParseHttpContent(verb, _parameters); _parameters.ThrowIfUnknown(); var subscriptionId = GetTenantOrSubscription(uri); TokenCacheInfo cacheInfo = persistentAuthHelper.GetToken(subscriptionId).Result; return HttpInvoke(uri, cacheInfo, verb, verbose, content).Result; } else { throw new CommandLineException(String.Format("Parameter '{0}' is invalid!", verb)); } } PrintUsage(); return 1; } catch (Exception ex) { DumpException(ex); return -1; } }
static Uri EnsureAbsoluteUri(string path, PersistentAuthHelper persistentAuthHelper) { Uri ret; if (Uri.TryCreate(path, UriKind.Absolute, out ret)) { return ret; } var env = persistentAuthHelper.IsCacheValid() ? persistentAuthHelper.AzureEnvironments : Utils.GetDefaultEnv(); var parts = path.Split(new[] { '/', '?' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length <= 0 || String.Equals(parts[0], "tenants", StringComparison.OrdinalIgnoreCase) || String.Equals(parts[0], "subscriptions", StringComparison.OrdinalIgnoreCase) || String.Equals(parts[0], "providers", StringComparison.OrdinalIgnoreCase)) { return new Uri(new Uri(ARMClient.Authentication.Constants.CSMUrls[(int)env]), path); } Guid guid; if (Guid.TryParse(parts[0], out guid)) { if (path.Length > 1 && String.Equals(parts[1], "services", StringComparison.OrdinalIgnoreCase)) { return new Uri(new Uri(ARMClient.Authentication.Constants.RdfeUrls[(int)env]), path); } } return new Uri(new Uri(ARMClient.Authentication.Constants.AADGraphUrls[(int)env]), path); }
static AzureEnvironments GetAzureEnvironments(Uri uri, PersistentAuthHelper persistentAuthHelper) { var host = uri.Host; for (int i = 0; i < Constants.AADGraphUrls.Length; ++i) { var url = Constants.AADGraphUrls[i]; if (url.IndexOf(host, StringComparison.OrdinalIgnoreCase) > 0) { if ((AzureEnvironments)i == AzureEnvironments.Prod) { return (AzureEnvironments)i; } if (!persistentAuthHelper.IsCacheValid()) { return (AzureEnvironments)i; } if (persistentAuthHelper.AzureEnvironments != AzureEnvironments.Prod) { return persistentAuthHelper.AzureEnvironments; } return (AzureEnvironments)i; } } for (int i = 0; i < Constants.CSMUrls.Length; ++i) { var url = Constants.CSMUrls[i]; if (url.IndexOf(host, StringComparison.OrdinalIgnoreCase) > 0) { return (AzureEnvironments)i; } } for (int i = 0; i < Constants.RdfeUrls.Length; ++i) { var url = Constants.RdfeUrls[i]; if (url.IndexOf(host, StringComparison.OrdinalIgnoreCase) > 0) { return (AzureEnvironments)i; } } for (int i = 0; i < Constants.SCMSuffixes.Length; ++i) { var suffix = Constants.SCMSuffixes[i]; if (host.IndexOf(suffix, StringComparison.OrdinalIgnoreCase) > 0) { return (AzureEnvironments)i; } } return AzureEnvironments.Prod; }