/// <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 TableSasQueryParameters parameters, StringBuilder stringBuilder) { if (!string.IsNullOrWhiteSpace(parameters.Version)) { stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Version, parameters.Version); } 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="TableSasQueryParameters"/>. /// </returns> public TableSasQueryParameters ToSasQueryParameters(TableSharedKeyCredential sharedKeyCredential) { sharedKeyCredential = sharedKeyCredential ?? throw Errors.ArgumentNull(nameof(sharedKeyCredential)); EnsureState(); var startTime = SasExtensions.FormatTimesForSasSigning(StartsOn); var expiryTime = SasExtensions.FormatTimesForSasSigning(ExpiresOn); // String to sign: http://msdn.microsoft.com/en-us/library/azure/dn140255.aspx var stringToSign = string.Join("\n", Permissions, startTime, expiryTime, GetCanonicalName(sharedKeyCredential.AccountName, TableName), Identifier, IPRange.ToString(), SasExtensions.ToProtocolString(Protocol), Version, PartitionKeyStart, RowKeyStart, PartitionKeyEnd, RowKeyEnd); var signature = TableSharedKeyCredential.ComputeSasSignature(sharedKeyCredential, stringToSign); var p = new TableSasQueryParameters( version: Version, tableName: TableName, partitionKeyStart: PartitionKeyStart, partitionKeyEnd: PartitionKeyEnd, rowKeyStart: RowKeyStart, rowKeyEnd: RowKeyEnd, protocol: Protocol, startsOn: StartsOn, expiresOn: ExpiresOn, ipRange: IPRange, identifier: Identifier, resource: null, permissions: Permissions, signature: signature); return(p); }