Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.
I am getting a "DMTS_InvalidEncryptionAlgorithmError" code when I try to programmatically create a CosmosDB datasource in Power BI using the REST APIs.
Here's the code I try to use, minus credentials
Hi @bohara2000 ,
You need to encrypt the credentials and call the API due to the PowerBI security.
Please see the below reference
https://docs.microsoft.com/en-us/power-bi/developer/encrypt-credentials
The below C# code helps you to do the encryption
public static class AsymmetricKeyEncryptionHelper
{
private const int SegmentLength = 85;
private const int EncryptedLength = 128;
public static string EncodeCredentials(string credentials, string publicKeyExponent, string publicKeyModulus)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(EncryptedLength * 8))
{
var parameters = rsa.ExportParameters(false);
parameters.Exponent = Convert.FromBase64String(publicKeyExponent);
parameters.Modulus = Convert.FromBase64String(publicKeyModulus);
rsa.ImportParameters(parameters);
return Encrypt(credentials, rsa);
}
}
private static string Encrypt(string plainText, RSACryptoServiceProvider rsa)
{
byte[] plainTextArray = Encoding.UTF8.GetBytes(plainText);
// Split the message into different segments, each segment's length is 85. So the result may be 85,85,85,20.
bool hasIncompleteSegment = plainTextArray.Length % SegmentLength != 0;
int segmentNumber = (!hasIncompleteSegment) ? (plainTextArray.Length / SegmentLength) : ((plainTextArray.Length / SegmentLength) + 1);
byte[] encryptedData = new byte[segmentNumber * EncryptedLength];
int encryptedDataPosition = 0;
for (var i = 0; i < segmentNumber; i++)
{
int lengthToCopy;
if (i == segmentNumber - 1 && hasIncompleteSegment)
lengthToCopy = plainTextArray.Length % SegmentLength;
else
lengthToCopy = SegmentLength;
var segment = new byte[lengthToCopy];
Array.Copy(plainTextArray, i * SegmentLength, segment, 0, lengthToCopy);
var segmentEncryptedResult = rsa.Encrypt(segment, true);
Array.Copy(segmentEncryptedResult, 0, encryptedData, encryptedDataPosition, segmentEncryptedResult.Length);
encryptedDataPosition += segmentEncryptedResult.Length;
}
return Convert.ToBase64String(encryptedData);
}
}
User | Count |
---|---|
14 | |
4 | |
2 | |
1 | |
1 |
User | Count |
---|---|
21 | |
3 | |
3 | |
2 | |
2 |