Переопределение параметров ЭП в зависимости от карточки
Переопределение параметров ЭП в зависимости от карточки¶
Если важно использовать различные типы подписи в зависимости от вида документа или от других полей карточки, к которой приложен подписанный файл, такие настройки можно переопределить со сборки TESSA 3.6.0.5.
Создайте клиентское расширение, которое вызывается на все запросы подписания и проверки подписи, выполняемые к серверу.
В этом примере в параметры запроса Request.Info
передаётся алиас типа карточки, полученный из текущего контекста UIContext.Current
:
using System.Threading.Tasks;
using Tessa.Cards;
using Tessa.Cards.Extensions;
using Tessa.Extensions.Default.Shared;
using Tessa.UI;
namespace Tessa.Extensions.Client
{
public class MySignatureRequestExtension : CardRequestExtension
{
[Registrator]
public class Registrator : RegistratorBase
{
public override void RegisterExtensions(IExtensionContainer extensionContainer)
{
extensionContainer
.RegisterExtension<ICardRequestExtension, MySignatureRequestExtension>(x => x
.WithOrder(ExtensionStage.AfterPlatform, 100)
.WithUnity(this.UnityContainer)
.WhenRequestTypes(DefaultRequestTypes.CAdESSignature));
}
}
public override async Task BeforeRequest(ICardRequestExtensionContext context)
{
var card = UIContext.Current.CardEditor?.CardModel?.Card;
if (card is null)
{
return;
}
context.Request.Info["TypeName"] = card.TypeName;
}
}
}
Теперь со стороны сервера переопределите класс EDSProvider
. Во всех его методах в параметр info
передаются данные из запроса к сервису Request.Info
.
В этом примере для файлов, приложенных к карточкам типа “Договор”, используются настройки подписания и проверки подписи по умолчанию, а для остальных карточек - настройки из карточки настроек ЭП.
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using CAdESLib.Document.Signature;
using CAdESLib.Helpers;
using Tessa.Cards;
using Tessa.Cards.Caching;
using Tessa.EDS;
using Tessa.Platform.EDS;
using Tessa.Platform.Storage;
using Unity;
using Unity.Lifetime;
namespace Tessa.Extensions.Server
{
public class MyEDSProvider : EDSProvider
{
[Registrator]
public class Registrator : RegistratorBase
{
public override void RegisterUnity()
{
this.UnityContainer
.RegisterType<IEDSProvider, MyEDSProvider>(new ContainerControlledLifetimeManager());
}
}
public MyEDSProvider(
ICAdESServiceSettings signatureSettings,
ICardCache cardCache,
Func<ICAdESServiceSettings, IDocumentSignatureService> getCAdESServiceFunc,
ICardStreamServerRepository streamServerRepository)
: base(signatureSettings, cardCache, getCAdESServiceFunc)
{
// создаём настройки по умолчанию для Договора
this.contractSettings = new CAdESServiceSettings(cardCache, streamServerRepository);
}
private readonly ICAdESServiceSettings contractSettings;
protected override async ValueTask<ICAdESServiceSettings> GetSettingsAsync(
Dictionary<string, object> info = null,
CancellationToken cancellationToken = default)
{
string typeName = info?.TryGet<string>("TypeName");
if (typeName == "Contract")
{
// для договора используем свои настройки
return this.contractSettings;
}
// для остальных карточек - настройки из базовой реализации - по карточке настроек ЭП
return await base.GetSettingsAsync(info, cancellationToken);
}
}
}