Thread: ASP.NET/Resources: Decrypting the URL and Getting the Resource Name

Resources: Decrypting the URL and Getting the Resource Name
http://blogs.telerik.com/blogs/posts/07-03-26/debugging-asp-net-2-0-web-resources-decrypting-the-url-and-getting-the-resource-name.aspx

Page Code:<%@ Page Language="C#" AutoEventWireup="true"  %>
<%@ Import Namespace="System.Web.Configuration" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Drawing" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
   
    <script type="text/javascript">
  window.onload = ShowWebResources;
  
  function ShowWebResources()
  {
   var scripts = document.getElementsByTagName("script");
   ShowWebResourceByAttribute(scripts, "src");
   
   var links = document.getElementsByTagName("link");
   ShowWebResourceByAttribute(links, "href");
  }
  
  function ShowWebResourceByAttribute(elements, attributeName)
  {
   var resourcesDropDown = document.getElementById("resourcesDropDown");
   for (var i = 0; i < elements.length; i++)
   {
    var element = elements[i];
    var data = element.getAttribute(attributeName);
    if (data != null && data.match(/webresource.axd/i))
    {
     var assemblyData = data.match(/d=([^&]+)&/)[1];
     
     var option = document.createElement("option");
     option.innerHTML = assemblyData;
     option.value = assemblyData;
     resourcesDropDown.appendChild(option);
    }
   }
  }
  
  function UpdateResourceText(textBox)
  {
   var data = textBox.value;
   var matches = data.match(/d=([^&]+)&/);
   if (matches != null && matches.length > 0)
   {
    textBox.value = matches[1];
   }
  }
  </script>
  
  <script runat="server">
  protected void decryptButton_Click(object sender, EventArgs e)
  {
   string urlEncodedData = Request.Form["resourceTextBox"];
   if (string.IsNullOrEmpty(urlEncodedData))
    urlEncodedData = Request.Form["resourcesDropDown"];
   if (string.IsNullOrEmpty(urlEncodedData))
    return;
   
   byte[] encryptedData = HttpServerUtility.UrlTokenDecode(urlEncodedData);

   Type machineKeySection = typeof(MachineKeySection);
   Type[] paramTypes = new Type[] { typeof(bool), typeof(byte[]), typeof(byte[]), typeof(int), typeof(int) };
   MethodInfo encryptOrDecryptData = machineKeySection.GetMethod("EncryptOrDecryptData", BindingFlags.Static | BindingFlags.NonPublic, null, paramTypes, null);

   try
   {
    byte[] decryptedData = (byte[])encryptOrDecryptData.Invoke(null, new object[] { false, encryptedData, null, 0, encryptedData.Length });
    string decrypted = Encoding.UTF8.GetString(decryptedData);

    decryptedLabel.BackColor = Color.Lime;
    decryptedLabel.Text = decrypted;
   }
   catch (TargetInvocationException)
   {
    decryptedLabel.BackColor = Color.Red;
    decryptedLabel.Text = "Error decrypting data. Are you running your page on the same server and inside the same application as the web resource URL that was generated?";
   }  
  }
  
  </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
  <label for="resourceTextBox">Paste a web resource URL:</label><br />
  <input type="text" id="resourceTextBox" name="resourceTextBox" onchange="UpdateResourceText(this)" /><br />
  <label for="resourcesDropDown">Select a web resource on this page:</label><br />
  <select id="resourcesDropDown" runat="server"></select><br />
  
  <asp:Button ID="decryptButton" runat="server" Text="Decrypt" OnClick="decryptButton_Click" />
  
  <hr />
  <asp:Label ID="decryptedLabel" runat="server"></asp:Label>
  
    </div>
    </form>
</body>
</html>