PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/Management/ManagementService/IdentityProvider/Program.cs

#
C# | 239 lines | 151 code | 49 blank | 39 comment | 13 complexity | 50448db182809a4f7f021e25407a98f6 MD5 | raw file
  1. //---------------------------------------------------------------------------------
  2. // Copyright 2010 Microsoft Corporation
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // You may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
  6. // THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR
  7. // CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
  8. // INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR
  9. // CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
  10. // MERCHANTABLITY OR NON-INFRINGEMENT.
  11. // See the Apache 2 License for the specific language governing
  12. // permissions and limitations under the License.
  13. //---------------------------------------------------------------------------------
  14. namespace ACS.Management
  15. {
  16. using System;
  17. using System.Globalization;
  18. using System.IO;
  19. using System.Linq;
  20. using System.Security.Cryptography.X509Certificates;
  21. using System.Text;
  22. using Common.ACS.Management;
  23. /// <summary>
  24. /// Manipulates a WS-Fed Identity Provider.
  25. /// </summary>
  26. class Program
  27. {
  28. static void Main(string[] args)
  29. {
  30. // create a WS-Fed identity provider by importing WS-Fed Metadata
  31. ProvisionIdpByFedmetadataImporter();
  32. // perform other operations on identity providers
  33. WSFederationIdentityProviderSample();
  34. FacebookIdentityProviderSample();
  35. Console.WriteLine("Done. Press ENTER to continue....\n");
  36. Console.ReadLine();
  37. }
  38. /// <summary>
  39. /// Helper function which deletes an identity provider and commits the change immediately.
  40. /// </summary>
  41. /// <param name="identityProviderName">Name of identity provider.</param>
  42. private static void DeleteIdentityProviderIfExists(string identityProviderName)
  43. {
  44. ManagementService svc = ManagementServiceHelper.CreateManagementServiceClient();
  45. svc.DeleteIdentityProviderIfExists(identityProviderName);
  46. svc.SaveChangesBatch();
  47. }
  48. //
  49. // This is a convenient way to provision an IdP using Federation Metadata.
  50. // Be aware that this mechanism doesn't allow you to control every IdP parameter.
  51. // You can, however, update the IdP once imported, and make the IdP available
  52. // to one or more RPs by adding associations.
  53. private static void ProvisionIdpByFedmetadataImporter()
  54. {
  55. const string identityProviderName = "http://example.org/adfs/services/trust";
  56. const string fedMetadataFile = "FederationMetadata.xml";
  57. DeleteIdentityProviderIfExists(identityProviderName);
  58. ImportIdentityProviderFromMetadata(fedMetadataFile);
  59. DisplayIdentityProvider(identityProviderName);
  60. DeleteIdentityProviderIfExists(identityProviderName);
  61. }
  62. private static void ImportIdentityProviderFromMetadata(string fedMetadataFile)
  63. {
  64. ManagementService svc = ManagementServiceHelper.CreateManagementServiceClient();
  65. using (Stream metadataFileStream = new FileStream(fedMetadataFile, FileMode.Open, FileAccess.Read))
  66. {
  67. svc.ImportIdentityProviderFromStream(metadataFileStream);
  68. }
  69. }
  70. private static void WSFederationIdentityProviderSample()
  71. {
  72. const string identityProviderName = "WS-Federation Identity Provider";
  73. DeleteIdentityProviderIfExists(identityProviderName);
  74. CreateSampleWSFederationIdentityProvider(identityProviderName);
  75. DisplayIdentityProvider(identityProviderName);
  76. UpdateWSFederationIdentityProvider(identityProviderName);
  77. DisplayIdentityProvider(identityProviderName);
  78. DeleteIdentityProviderIfExists(identityProviderName);
  79. }
  80. private static void FacebookIdentityProviderSample()
  81. {
  82. const string applicationId = "appId";
  83. string name = string.Format(CultureInfo.InvariantCulture, "Facebook-{0}", applicationId);
  84. DeleteIdentityProviderIfExists(name);
  85. CreateFacebookIdentityProvider(applicationId);
  86. DisplayIdentityProvider(name);
  87. DeleteIdentityProviderIfExists(name);
  88. }
  89. private static void CreateFacebookIdentityProvider(string applicationId)
  90. {
  91. const string applicationSecret = "appSecret";
  92. ManagementService svc = ManagementServiceHelper.CreateManagementServiceClient();
  93. svc.CreateFacebookIdentityProvider(applicationId, applicationSecret, "email,user_about_me");
  94. svc.SaveChangesBatch();
  95. }
  96. private static void CreateSampleWSFederationIdentityProvider(string identityProviderName)
  97. {
  98. ManagementService svc = ManagementServiceHelper.CreateManagementServiceClient();
  99. DateTime startDate = DateTime.UtcNow;
  100. DateTime endDate = startDate.AddYears(1);
  101. // Signing certificates can be found in a WSFederation IdP's fed-metadata.
  102. const string signingCertFileName = "identitykey.cer";
  103. IdentityProvider idp = svc.CreateWsFederationIdentityProvider(identityProviderName,
  104. X509Certificate.CreateFromCertFile(signingCertFileName).GetRawCertData(),
  105. startDate,
  106. endDate,
  107. "http://SampleIdentityProvider.com/sign-in/");
  108. // Do not include the ACS Management Relying Party
  109. svc.AssociateIdentityProvidersWithRelyingParties(new[] { idp }, svc.RelyingParties.Where(rp => rp.Name != "AccessControlManagement"));
  110. svc.SaveChangesBatch();
  111. }
  112. private static void UpdateWSFederationIdentityProvider(string identityProviderName)
  113. {
  114. Console.WriteLine("Updating identity provider properties...");
  115. Console.WriteLine();
  116. ManagementService svc = ManagementServiceHelper.CreateManagementServiceClient();
  117. // Retrieve Identity Provider
  118. IdentityProvider identityProvider = svc.GetIdentityProviderByName(identityProviderName, true);
  119. if (identityProvider != null)
  120. {
  121. // update DisplayName
  122. identityProvider.DisplayName = "*SampleIdentityProviderNewDisplayName*";
  123. //update sign-in address
  124. IdentityProviderAddress signInAddress = identityProvider.IdentityProviderAddresses.Where(m => m.EndpointType == IdentityProviderEndpointType.SignIn.ToString()).FirstOrDefault();
  125. if (signInAddress != null)
  126. {
  127. signInAddress.Address = "http://SampleIdentityProvider/New-Sign-In";
  128. svc.UpdateObject(signInAddress);
  129. }
  130. svc.UpdateObject(identityProvider);
  131. svc.SaveChangesBatch();
  132. }
  133. }
  134. private static void DisplayIdentityProvider(string identityProviderName)
  135. {
  136. Console.WriteLine("\nRetrieve Identity Provider (Name = {0})\n", identityProviderName);
  137. ManagementService svc = ManagementServiceHelper.CreateManagementServiceClient();
  138. IdentityProvider identityProvider = svc.GetIdentityProviderByName(identityProviderName, true);
  139. // Display the values of returned Identity Provider
  140. if (identityProvider != null)
  141. {
  142. Console.WriteLine("\tId = {0}\n", identityProvider.Id);
  143. Console.WriteLine("\tDisplayName = {0}\n", identityProvider.DisplayName);
  144. Console.WriteLine("\tLoginParameters = {0}\n", identityProvider.LoginParameters);
  145. Console.WriteLine("\tWebSSOProtocolType = {0}\n", identityProvider.WebSSOProtocolType);
  146. // display keys associated to the Identity Provider
  147. foreach (IdentityProviderKey identityProviderKey in identityProvider.IdentityProviderKeys)
  148. {
  149. DisplayIdentityProviderKey(identityProviderKey);
  150. }
  151. // display addresses associated to the Identity Provider
  152. foreach (IdentityProviderAddress identityProviderAddress in identityProvider.IdentityProviderAddresses)
  153. {
  154. DisplayIdentityProviderAddress(identityProviderAddress);
  155. }
  156. }
  157. }
  158. private static void DisplayIdentityProviderKey(IdentityProviderKey identityProviderKey)
  159. {
  160. // Display the values of returned Identity Provider
  161. if (identityProviderKey != null)
  162. {
  163. //
  164. // Values for Application keys should be displayed as UTF-8. Symmetric keys and certificates are Base64.
  165. //
  166. string keyValue = identityProviderKey.Type == IdentityProviderKeyType.ApplicationKey.ToString() ?
  167. Encoding.ASCII.GetString(identityProviderKey.Value) : Convert.ToBase64String(identityProviderKey.Value);
  168. Console.WriteLine("\tIdentity Provider Key (Id = {0})\n", identityProviderKey.Id);
  169. Console.WriteLine("\t\tId = {0}\n", identityProviderKey.Id);
  170. Console.WriteLine("\t\tDisplayName = {0}\n", identityProviderKey.DisplayName);
  171. Console.WriteLine("\t\tType = {0}\n", identityProviderKey.Type);
  172. Console.WriteLine("\t\tUsage = {0}\n", identityProviderKey.Usage);
  173. Console.WriteLine("\t\tStartDate = {0}\n", identityProviderKey.StartDate);
  174. Console.WriteLine("\t\tEndDate = {0}\n", identityProviderKey.EndDate);
  175. Console.WriteLine("\t\tValue = {0}\n", keyValue);
  176. }
  177. }
  178. private static void DisplayIdentityProviderAddress(IdentityProviderAddress identityProviderAddress)
  179. {
  180. if (identityProviderAddress == null)
  181. {
  182. return;
  183. }
  184. Console.WriteLine("\tIdentity Provider Address (Id = {0})\n", identityProviderAddress.Id);
  185. Console.WriteLine("\t\tId = {0}\n", identityProviderAddress.Id);
  186. Console.WriteLine("\t\tAddress = {0}\n", identityProviderAddress.Address);
  187. Console.WriteLine("\t\tEndpointType = {0}\n", identityProviderAddress.EndpointType);
  188. }
  189. }
  190. }