Forum Discussion

powerbidev123's avatar
powerbidev123
Icon for Solution Sage rankSolution Sage
1 year ago
Solved

Integrate C# code in powerbi report

Requirement:
I need to display a downloadable PDF URL link in a Power BI report. The URL should contain an encrypted ID.

Problem Statement:

  • The downloadable PDF URL is generated using an ID that is encrypted via a third-party DLL from a cryptography package.
  • The encryption and URL generation are implemented in C# code.
  • I need to integrate this encrypted URL into my Power BI report so that users can access and download the PDF.

Query:

  • What is the best approach to include this encrypted PDF URL in Power BI?
  • How can I generate and display this URL dynamically in the report while ensuring proper encryption is applied?
  • Are there any Power BI limitations or best practices I should consider when handling such encrypted URLs?

Would appreciate any guidance on the best way to implement this. Thanks in advance!

  • Hello powerbidev123,

     

    Since Power BI cannot run C# code natively, the best approach is to:

     

    1. Host the C# encryption logic in an Azure Function, API, or Power Automate connector.
    2. Call this API from Power BI to dynamically generate the encrypted URL.

     

    a) So basically, a Power Automate Flow will take the unencrypted ID from Power BI.

    using System;
    using System.Web.Http;
    using System.Security.Cryptography;
    using System.Text;
    
    public static class EncryptIDFunction
    {
        [FunctionName("EncryptID")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req)
        {
            string id = req.Query["id"];
            if (string.IsNullOrEmpty(id)) return new BadRequestObjectResult("Missing ID");
    
            string encryptedId = EncryptID(id);
            string url = $"https://yourdomain.com/download?file={encryptedId}";
            
            return new OkObjectResult(new { pdfUrl = url });
        }
    
        private static string EncryptID(string id)
        {
            using (var aes = Aes.Create())
            {
                aes.Key = Encoding.UTF8.GetBytes("your-32-byte-key");
                aes.IV = Encoding.UTF8.GetBytes("your-16-byte-iv");
                
                var encryptor = aes.CreateEncryptor();
                byte[] encryptedBytes = encryptor.TransformFinalBlock(
                    Encoding.UTF8.GetBytes(id), 0, id.Length);
                
                return Convert.ToBase64String(encryptedBytes);
            }
        }
    }
    

    b) Then, the Flow calls an Azure Function or C# Web API to encrypt the ID.

     

    c)Finally, the encrypted URL is returned to Power BI and displayed in a table.

2 Replies

  • Hello powerbidev123,

     

    Since Power BI cannot run C# code natively, the best approach is to:

     

    1. Host the C# encryption logic in an Azure Function, API, or Power Automate connector.
    2. Call this API from Power BI to dynamically generate the encrypted URL.

     

    a) So basically, a Power Automate Flow will take the unencrypted ID from Power BI.

    using System;
    using System.Web.Http;
    using System.Security.Cryptography;
    using System.Text;
    
    public static class EncryptIDFunction
    {
        [FunctionName("EncryptID")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req)
        {
            string id = req.Query["id"];
            if (string.IsNullOrEmpty(id)) return new BadRequestObjectResult("Missing ID");
    
            string encryptedId = EncryptID(id);
            string url = $"https://yourdomain.com/download?file={encryptedId}";
            
            return new OkObjectResult(new { pdfUrl = url });
        }
    
        private static string EncryptID(string id)
        {
            using (var aes = Aes.Create())
            {
                aes.Key = Encoding.UTF8.GetBytes("your-32-byte-key");
                aes.IV = Encoding.UTF8.GetBytes("your-16-byte-iv");
                
                var encryptor = aes.CreateEncryptor();
                byte[] encryptedBytes = encryptor.TransformFinalBlock(
                    Encoding.UTF8.GetBytes(id), 0, id.Length);
                
                return Convert.ToBase64String(encryptedBytes);
            }
        }
    }
    

    b) Then, the Flow calls an Azure Function or C# Web API to encrypt the ID.

     

    c)Finally, the encrypted URL is returned to Power BI and displayed in a table.