/******************************************************************************* * Copyright 2012-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"). You may not use * this file except in compliance with the License. A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. * ***************************************************************************** * * AWS Tools for Windows (TM) PowerShell (TM) * */ using System; using System.Collections.Generic; using System.Linq; using System.Management.Automation; using System.Text; using Amazon.PowerShell.Common; using Amazon.Runtime; using Amazon.IdentityManagement; using Amazon.IdentityManagement.Model; namespace Amazon.PowerShell.Cmdlets.IAM { /// /// Creates an IAM entity to describe an identity provider (IdP) that supports OpenID /// Connect (OIDC). /// /// /// /// The OIDC provider that you create with this operation can be used as a principal in /// a role's trust policy. Such a policy establishes a trust relationship between Amazon /// Web Services and the OIDC provider. /// /// If you are using an OIDC identity provider from Google, Facebook, or Amazon Cognito, /// you don't need to create a separate IAM identity provider. These OIDC identity providers /// are already built-in to Amazon Web Services and are available for your use. Instead, /// you can move directly to creating new roles using your identity provider. To learn /// more, see Creating /// a role for web identity or OpenID connect federation in the IAM User Guide. /// /// When you create the IAM OIDC provider, you specify the following: /// /// You get all of this information from the OIDC IdP you want to use to access Amazon /// Web Services. /// /// Amazon Web Services secures communication with some OIDC identity providers (IdPs) /// through our library of trusted root certificate authorities (CAs) instead of using /// a certificate thumbprint to verify your IdP server certificate. These OIDC IdPs include /// Auth0, GitHub, Google, and those that use an Amazon S3 bucket to host a JSON Web Key /// Set (JWKS) endpoint. In these cases, your legacy thumbprint remains in your configuration, /// but is no longer used for validation. /// /// The trust for the OIDC provider is derived from the IAM provider that this operation /// creates. Therefore, it is best to limit access to the CreateOpenIDConnectProvider /// operation to highly privileged users. /// /// [Cmdlet("New", "IAMOpenIDConnectProvider", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.Medium)] [OutputType("System.String")] [AWSCmdlet("Calls the AWS Identity and Access Management CreateOpenIDConnectProvider API operation.", Operation = new[] {"CreateOpenIDConnectProvider"}, SelectReturnType = typeof(Amazon.IdentityManagement.Model.CreateOpenIDConnectProviderResponse))] [AWSCmdletOutput("System.String or Amazon.IdentityManagement.Model.CreateOpenIDConnectProviderResponse", "This cmdlet returns a System.String object.", "The service call response (type Amazon.IdentityManagement.Model.CreateOpenIDConnectProviderResponse) can also be referenced from properties attached to the cmdlet entry in the $AWSHistory stack." )] public partial class NewIAMOpenIDConnectProviderCmdlet : AmazonIdentityManagementServiceClientCmdlet, IExecutor { #region Parameter ClientIDList /// /// /// Provides a list of client IDs, also known as audiences. When a mobile or web app registers /// with an OpenID Connect provider, they establish a value that identifies the application. /// This is the value that's sent as the client_id parameter on OAuth requests.You can register multiple client IDs with the same provider. For example, you might /// have multiple applications that use the same OIDC provider. You cannot register more /// than 100 client IDs with a single IAM OIDC provider.There is no defined format for a client ID. The CreateOpenIDConnectProviderRequest /// operation accepts client IDs up to 255 characters long. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.String[] ClientIDList { get; set; } #endregion #region Parameter Tag /// /// /// A list of tags that you want to attach to the new IAM OpenID Connect (OIDC) provider. /// Each tag consists of a key name and an associated value. For more information about /// tagging, see Tagging /// IAM resources in the IAM User Guide.If any one of the tags is invalid or if you exceed the allowed maximum number of tags, /// then the entire request fails and the resource is not created. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] [Alias("Tags")] public Amazon.IdentityManagement.Model.Tag[] Tag { get; set; } #endregion #region Parameter ThumbprintList /// /// /// A list of server certificate thumbprints for the OpenID Connect (OIDC) identity provider's /// server certificates. Typically this list includes only one entry. However, IAM lets /// you have up to five thumbprints for an OIDC provider. This lets you maintain multiple /// thumbprints if the identity provider is rotating certificates.The server certificate thumbprint is the hex-encoded SHA-1 hash value of the X.509 /// certificate used by the domain where the OpenID Connect provider makes its keys available. /// It is always a 40-character string.You must provide at least one thumbprint when creating an IAM OIDC provider. For example, /// assume that the OIDC provider is server.example.com and the provider /// stores its keys at https://keys.server.example.com/openid-connect. In that case, the /// thumbprint string would be the hex-encoded SHA-1 hash value of the certificate used /// by https://keys.server.example.com.For more information about obtaining the OIDC provider thumbprint, see Obtaining /// the thumbprint for an OpenID Connect provider in the IAM user Guide. /// /// #if !MODULAR [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] #else [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true, Mandatory = true)] [System.Management.Automation.AllowEmptyCollection] [System.Management.Automation.AllowNull] #endif [Amazon.PowerShell.Common.AWSRequiredParameter] public System.String[] ThumbprintList { get; set; } #endregion #region Parameter Url /// /// /// The URL of the identity provider. The URL must begin with https:// and /// should correspond to the iss claim in the provider's OpenID Connect ID /// tokens. Per the OIDC standard, path components are allowed but query parameters are /// not. Typically the URL consists of only a hostname, like https://server.example.org /// or https://example.com. The URL should not contain a port number. You cannot register the same provider multiple times in a single Amazon Web Services /// account. If you try to submit a URL that has already been used for an OpenID Connect /// provider in the Amazon Web Services account, you will get an error. /// /// #if !MODULAR [System.Management.Automation.Parameter(Position = 0, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true)] #else [System.Management.Automation.Parameter(Position = 0, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true, Mandatory = true)] [System.Management.Automation.AllowEmptyString] [System.Management.Automation.AllowNull] #endif [Amazon.PowerShell.Common.AWSRequiredParameter] public System.String Url { get; set; } #endregion #region Parameter Select /// /// Use the -Select parameter to control the cmdlet output. The default value is 'OpenIDConnectProviderArn'. /// Specifying -Select '*' will result in the cmdlet returning the whole service response (Amazon.IdentityManagement.Model.CreateOpenIDConnectProviderResponse). /// Specifying the name of a property of type Amazon.IdentityManagement.Model.CreateOpenIDConnectProviderResponse will result in that property being returned. /// Specifying -Select '^ParameterName' will result in the cmdlet returning the selected cmdlet parameter value. /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public string Select { get; set; } = "OpenIDConnectProviderArn"; #endregion #region Parameter PassThru /// /// Changes the cmdlet behavior to return the value passed to the Url parameter. /// The -PassThru parameter is deprecated, use -Select '^Url' instead. This parameter will be removed in a future version. /// [System.Obsolete("The -PassThru parameter is deprecated, use -Select '^Url' instead. This parameter will be removed in a future version.")] [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public SwitchParameter PassThru { get; set; } #endregion #region Parameter Force /// /// This parameter overrides confirmation prompts to force /// the cmdlet to continue its operation. This parameter should always /// be used with caution. /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public SwitchParameter Force { get; set; } #endregion protected override void ProcessRecord() { this._AWSSignerType = "v4"; base.ProcessRecord(); var resourceIdentifiersText = FormatParameterValuesForConfirmationMsg(nameof(this.Url), MyInvocation.BoundParameters); if (!ConfirmShouldProceed(this.Force.IsPresent, resourceIdentifiersText, "New-IAMOpenIDConnectProvider (CreateOpenIDConnectProvider)")) { return; } var context = new CmdletContext(); // allow for manipulation of parameters prior to loading into context PreExecutionContextLoad(context); #pragma warning disable CS0618, CS0612 //A class member was marked with the Obsolete attribute if (ParameterWasBound(nameof(this.Select))) { context.Select = CreateSelectDelegate(Select) ?? throw new System.ArgumentException("Invalid value for -Select parameter.", nameof(this.Select)); if (this.PassThru.IsPresent) { throw new System.ArgumentException("-PassThru cannot be used when -Select is specified.", nameof(this.Select)); } } else if (this.PassThru.IsPresent) { context.Select = (response, cmdlet) => this.Url; } #pragma warning restore CS0618, CS0612 //A class member was marked with the Obsolete attribute if (this.ClientIDList != null) { context.ClientIDList = new List(this.ClientIDList); } if (this.Tag != null) { context.Tag = new List(this.Tag); } if (this.ThumbprintList != null) { context.ThumbprintList = new List(this.ThumbprintList); } #if MODULAR if (this.ThumbprintList == null && ParameterWasBound(nameof(this.ThumbprintList))) { WriteWarning("You are passing $null as a value for parameter ThumbprintList which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues."); } #endif context.Url = this.Url; #if MODULAR if (this.Url == null && ParameterWasBound(nameof(this.Url))) { WriteWarning("You are passing $null as a value for parameter Url which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues."); } #endif // allow further manipulation of loaded context prior to processing PostExecutionContextLoad(context); var output = Execute(context) as CmdletOutput; ProcessOutput(output); } #region IExecutor Members public object Execute(ExecutorContext context) { var cmdletContext = context as CmdletContext; // create request var request = new Amazon.IdentityManagement.Model.CreateOpenIDConnectProviderRequest(); if (cmdletContext.ClientIDList != null) { request.ClientIDList = cmdletContext.ClientIDList; } if (cmdletContext.Tag != null) { request.Tags = cmdletContext.Tag; } if (cmdletContext.ThumbprintList != null) { request.ThumbprintList = cmdletContext.ThumbprintList; } if (cmdletContext.Url != null) { request.Url = cmdletContext.Url; } CmdletOutput output; // issue call var client = Client ?? CreateClient(_CurrentCredentials, _RegionEndpoint); try { var response = CallAWSServiceOperation(client, request); object pipelineOutput = null; pipelineOutput = cmdletContext.Select(response, this); output = new CmdletOutput { PipelineOutput = pipelineOutput, ServiceResponse = response }; } catch (Exception e) { output = new CmdletOutput { ErrorResponse = e }; } return output; } public ExecutorContext CreateContext() { return new CmdletContext(); } #endregion #region AWS Service Operation Call private Amazon.IdentityManagement.Model.CreateOpenIDConnectProviderResponse CallAWSServiceOperation(IAmazonIdentityManagementService client, Amazon.IdentityManagement.Model.CreateOpenIDConnectProviderRequest request) { Utils.Common.WriteVerboseEndpointMessage(this, client.Config, "AWS Identity and Access Management", "CreateOpenIDConnectProvider"); try { #if DESKTOP return client.CreateOpenIDConnectProvider(request); #elif CORECLR return client.CreateOpenIDConnectProviderAsync(request).GetAwaiter().GetResult(); #else #error "Unknown build edition" #endif } catch (AmazonServiceException exc) { var webException = exc.InnerException as System.Net.WebException; if (webException != null) { throw new Exception(Utils.Common.FormatNameResolutionFailureMessage(client.Config, webException.Message), webException); } throw; } } #endregion internal partial class CmdletContext : ExecutorContext { public List ClientIDList { get; set; } public List Tag { get; set; } public List ThumbprintList { get; set; } public System.String Url { get; set; } public System.Func Select { get; set; } = (response, cmdlet) => response.OpenIDConnectProviderArn; } } }