Тип или имя пространства имен «WindowsSecureMimeContext» не найден - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь использовать MimeKit для отправки электронных писем с цифровой подписью.Сертификат, который я использую для подписи электронных писем, хранится в хранилище сертификатов LocalMachine, поэтому я хочу использовать WindowsSecureMimeContext.Однако я получаю тип или пространство имен не удалось найти ошибку при попытке использовать его.Я включил MimeKit и MimeKit.Cryptography, но ошибка все еще сохраняется.Я пытаюсь использовать его в проекте библиотеки классов, ориентированном на .NET Core 2.2, если это имеет значение.

Вот мой код, есть идеи, почему я получаю ошибку?

using MimeKit;
using MimeKit.Cryptography;
using BO;

namespace BLL
{
    public class EmailService : IEmailService
    {    
        public void Send(Email email)
        {
            CryptographyContext.Register(typeof(WindowsSecureMimeContext));
            var message = new MimeMessage();
            message.Subject = email.Subject;
            using (var ctx = new WindowsSecureMimeContext(System.Security.Cryptography.X509Certificates.StoreLocation.LocalMachine)) {
            }
        }
    }
}

Ниже приведен обновленный код, который мне удалось получить.

using MailKit.Net.Smtp;
using Microsoft.Extensions.Configuration;
using MimeKit;
using MimeKit.Cryptography;
using OGC.CIS.ADR.BO;
using System.Security.Cryptography.X509Certificates;

namespace OGC.CIS.ADR.BLL
{
    public class EmailService : IEmailService
    {
        private readonly IConfiguration _config;
        public EmailService(IConfiguration config)
        {
            _config = config;
        }

        public void Send(Email email)
        {
            CryptographyContext.Register(typeof(MySecureMimeContext));
            var message = new MimeMessage();
            var sender = new MailboxAddress(_config.GetValue<string>("AppSettings:SubjectCN"));
            message.From.Add(sender);
            message.Subject = email.Subject;
            var body = new TextPart("plain")
            {
                Text = email.Body
            };
            using (var ctx = new MySecureMimeContext()) {
                var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
                store.Open(OpenFlags.ReadOnly);
                var certs = store.Certificates.Find(X509FindType.FindBySubjectName, _config.GetValue<string>("AppSettings:SubjectCN"), true);
                //var cert = Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate(certs[0]);
                ctx.Import(certs[0]);
                message.Body = MultipartSigned.Create(ctx, sender, DigestAlgorithm.Sha256, body);
            }
        }
    }
}

А вот обновленный метод импорта, созданный мной для хранения закрытого ключа.

public void Import (System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
{
    if (certificate == null)
        throw new ArgumentNullException(nameof(certificate));
    var bcCert = Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate(certificate);
    var fingerprint = bcCert.GetFingerprint();
    if (fingerprints.Add(fingerprint))
        certificates.Add(bcCert);

    if (!keys.ContainsKey(fingerprint))
        keys.Add(fingerprint, Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(certificate.PrivateKey).Private);    
}

1 Ответ

0 голосов
/ 09 апреля 2019

WindowsSecureMimeContext не существует в версии библиотеки .NETStandard 2.0, поскольку API-интерфейс System.Security, необходимый для этого класса, не существует.

Вам потребуется написать собственный класс SecureMimeContext.Скорее всего, вы захотите создать подкласс DefaultSecureMimeContext или TemporarySecureMimeContext, если вы просто хотите что-то очень простое.

...