在网页中嵌入.Net C#?

时间:2010-07-19 18:03:44

标签: c# web-applications embed

我想嵌入一些C#.Net代码,在网页中执行一些简单的加密/解密功能。这将是一个内部网页,因此用户将被隐式信任。有没有办法做到这一点?我需要点击用户的Windows-MY密钥存储区(通过CAPI)来提取密钥以进行解密,并命中LDAP服务器以获取用于加密的公钥。

6 个答案:

答案 0 :(得分:4)

您可以使用Silverlight。

但请注意,您也可以在Javascript中进行加密:

答案 1 :(得分:4)

通过“进入网页”定义您的意思?网页由浏览器运行,浏览器通常只知道Javascript(和Java)。

您可以将其作为Silverlight应用程序执行。

答案 2 :(得分:1)

Silverlight或者可能是JavaScript编译器的c#,例如Script#

答案 3 :(得分:1)

考虑编写一个新的ASP.NET应用程序,其中加密/解密逻辑位于应用程序中。也许创建一个新的webforms应用程序,其中包含专门用于处理这些请求的页面。

考虑在单独的.NET程序集中编写该加密逻辑,然后从ASP.NET应用程序引用该程序集。

目前尚不清楚您是希望将此作为一项服务,还是用户希望在文本框中输入文本,并让其在访问时执行加密。

答案 4 :(得分:1)

我最后使用C#伪造了一个COM对象,然后使用JavaScript来调用该COM对象,并且能够通过浏览器以这种方式与CAPI进行交互。

JavaScript的:

<html>
<head>
<script language="javascript">
var keystore = new ActiveXObject("RBCrypto.KeyStore");

function getCertList()
{
   try {
     keystore.openKeyStore("MY", true, false);
     var size = keystore.getStoreSize();

     var list = document.getElementById('list');
     list.size = size;

     for(var i = 0; i < size; i++)
     {
        var fname = keystore.getFriendlyName(i, true);
        var opt = new Option(fname, fname);
        list.options.add(opt);
     }
   }
   catch(err)
   {
     alert(err.description);
   }
}
</script>
</head>
<body onload="getCertList()">
   <center>
    <h2>KeyStore Test</h2>
    <hr />
    <br />
    <select id="list"></select>
   </center>
</body>
</html>

C#:

using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

namespace RBCrypto
{
    public interface AXInterface
    {
        void openKeyStore(string storeName, bool currentUser, bool readOnly);
        int getStoreSize();
        string getFriendlyName(int index, bool subjectNameIfEmpty);
    }

    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class KeyStore :AXInterface
    {
        public void openKeyStore(string storeName, bool currentUser, bool readOnly)
        {
            if (keystoreInitialized)
                throw new Exception("Key Store must be closed before re-initialization");

            try
            {
                if (currentUser) //user wants to open store used by the current user
                    certificateStore = new X509Store(storeName, StoreLocation.CurrentUser);
                else             //user wants to open store used by local machine
                    certificateStore = new X509Store(storeName, StoreLocation.LocalMachine);

                if (readOnly)
                    certificateStore.Open(OpenFlags.ReadOnly);
                else
                    certificateStore.Open(OpenFlags.ReadWrite);

                allCertificates = certificateStore.Certificates;

                if (allCertificates == null)
                {
                    certificateStore.Close();
                    throw new NullReferenceException("Certificates could not be gathered");
                }

                keystoreInitialized = true;
            }
            catch (ArgumentException ae)
            {
                throw ae;
            }
            catch (SecurityException se)
            {
                throw se;
            }
            catch (CryptographicException ce)
            {
                throw ce;
            }
            catch (NullReferenceException ne)
            {
                throw ne;
            }
        }

        ....
   }
}

C#AssemblyInfo:

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(true)]

为了使其正常工作,用户必须在他们的计算机上安装.dll(确保指定在安装程序中将.dll注册为vsdraCOM),并且必须将您的站点添加到其受信任的站点。

答案 5 :(得分:0)

您可以使用AJAX并调用您在网络上使用的加密功能。