/// <summary> /// Builds the query parameter string for the SasQueryParameters instance. /// </summary> /// <param name="parameters"></param> /// <param name="stringBuilder"> /// StringBuilder instance to add the query params to /// </param> internal static void AppendProperties(this TableAccountSasQueryParameters parameters, StringBuilder stringBuilder) { if (!string.IsNullOrWhiteSpace(parameters.Version)) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Version, parameters.Version); } if (!(parameters is TableSasQueryParameters)) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Services, TableConstants.Sas.TableAccountServices.Table); } if (parameters.ResourceTypes != null) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.ResourceTypes, parameters.ResourceTypes.Value.ToPermissionsString()); } if (parameters.Protocol != default) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Protocol, parameters.Protocol.ToProtocolString()); } if (parameters.StartsOn != DateTimeOffset.MinValue) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.StartTime, WebUtility.UrlEncode(parameters.StartsOn.ToString(TableConstants.Sas.SasTimeFormat, CultureInfo.InvariantCulture))); } if (parameters.ExpiresOn != DateTimeOffset.MinValue) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.ExpiryTime, WebUtility.UrlEncode(parameters.ExpiresOn.ToString(TableConstants.Sas.SasTimeFormat, CultureInfo.InvariantCulture))); } var ipr = parameters.IPRange.ToString(); if (ipr.Length > 0) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.IPRange, ipr); } if (!string.IsNullOrWhiteSpace(parameters.Identifier)) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Identifier, parameters.Identifier); } if (!string.IsNullOrWhiteSpace(parameters.Resource)) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Resource, parameters.Resource); } if (!string.IsNullOrWhiteSpace(parameters.Permissions)) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Permissions, parameters.Permissions); } if (!string.IsNullOrWhiteSpace(parameters.Signature)) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Signature, WebUtility.UrlEncode(parameters.Signature)); } }
/// <summary> /// Use an account's <see cref="TableSharedKeyCredential"/> to sign this /// shared access signature values to produce the proper SAS query /// parameters for authenticating requests. /// </summary> /// <param name="sharedKeyCredential"> /// The storage account's <see cref="TableSharedKeyCredential"/>. /// </param> /// <returns> /// An instance of <see cref="TableAccountSasQueryParameters"/>. /// </returns> public TableAccountSasQueryParameters ToSasQueryParameters(TableSharedKeyCredential sharedKeyCredential) { sharedKeyCredential = sharedKeyCredential ?? throw Errors.ArgumentNull(nameof(sharedKeyCredential)); EnsureState(); var startTime = TableSasExtensions.FormatTimesForSasSigning(StartsOn); var expiryTime = TableSasExtensions.FormatTimesForSasSigning(ExpiresOn); // String to sign: https://docs.microsoft.com/en-us/rest/api/storageservices/create-account-sas#constructing-the-signature-string var stringToSign = string.Join("\n", sharedKeyCredential.AccountName, Permissions, TableConstants.Sas.TableAccountServices.Table, ResourceTypes.ToPermissionsString(), startTime, expiryTime, IPRange.ToString(), Protocol.ToProtocolString(), Version, ""); var signature = TableSharedKeyCredential.ComputeSasSignature(sharedKeyCredential, stringToSign); var p = new TableAccountSasQueryParameters( version: Version, resourceTypes: ResourceTypes, protocol: Protocol, startsOn: StartsOn, expiresOn: ExpiresOn, ipRange: IPRange, identifier: Identifier, resource: null, permissions: Permissions, signature: signature); return(p); }