Вставить .Net C # в веб-страницу? - PullRequest
3 голосов
/ 19 июля 2010

Я хотел бы встроить некоторый код C # .Net, который выполняет несколько простых функций шифрования / дешифрования, на веб-страницу.Это будет внутренняя веб-страница, поэтому пользователям неявно доверяют.Есть какой-либо способ сделать это?Мне нужно будет зайти в хранилище ключей Windows-MY пользователя (через CAPI), чтобы извлечь ключи для дешифрования, и на сервер LDAP, чтобы получить открытые ключи для шифрования.

Ответы [ 6 ]

4 голосов
/ 19 июля 2010

Определите, что вы подразумеваете под "в веб-страницу"? Веб-страницы запускаются браузерами, которые обычно знают только Javascript (и Java).

Вы можете сделать это как приложение Silverlight.

4 голосов
/ 19 июля 2010

Вы можете использовать Silverlight.

Обратите внимание, однако, что вы можете также выполнять шифрование в Javascript:

1 голос
/ 18 августа 2010

Я закончил тем, что подделал COM-объект с использованием C #, а затем использовал 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)]

Для того, чтобы это работало, пользователь должен isntall ваш .dll на своем компьютере (Убедитесь, что вы указали, чтобы зарегистрировать свой.dll, как vsdraCOM в вашем установщике), и они должны добавить ваш сайт в свои доверенные сайты.

1 голос
/ 19 июля 2010

Рассмотрите возможность создания нового приложения ASP.NET, в котором ваша логика шифрования / дешифрования находится внутри приложения. Возможно, создайте новое приложение веб-форм со страницей, посвященной отправке этих запросов.

Подумайте о том, чтобы записать эту логику шифрования в отдельную сборку .NET, а затем сослаться на эту сборку из приложения ASP.NET.

Неясно, хотели ли вы это как услуга, или пользователи ожидали бы ввести текст в текстовое поле, и чтобы оно выполняло шифрование при посещении.

1 голос
/ 19 июля 2010

Silverlight или, возможно, ac # для компилятора JavaScript, например Script # .

0 голосов
/ 19 июля 2010

Вы можете использовать AJAX и вызывать функцию шифрования, которую вы использовали по сети.

...