Sist endret: 29. okt. 2026
Preview: Dette er dokumentasjonen for Altinn Studio v9, som er en forhåndsversjon. Gjeldende versjon er v8. For å se dokumentasjonen for gjeldende versjon, velg v8 i versjonsvelgeren i menyen til venstre.

Brukerstyrt signering

Slik setter du opp brukerstyrt signering i tjenesten din.

Tilgjengelig fra v8.6.0

Før du starter

Maskinporten

Du trenger Maskinporten både for meldingstjenesten og for å jobbe med beskyttede data.

Hvis du trenger hjelp med å sette opp Maskinporten i appen din, finner du det du trenger i denne veiledningen.

Meldingstjenesten

Brukerstyrt signering bruker meldingstjenesten (Correspondence) i Altinn. Den må du sette opp separat.

Meldingstjenesten sender beskjed til de som skal signere om at de må signere et skjema i Altinn. Den sender også en kvittering til innboksen når de har signert.

Slik kommer du i gang med meldingstjenesten.

Eksempel på konfigurasjon

I dette repositoriet ligger et eksempel på en app som har brukerstyrt signering.

Flyten i appen er slik:

  1. Brukeren som fyller ut skjemaet oppgir fødselsnummer og etternavn til de som skal signere. Hvis noen skal signere på vegne av en virksomhet, oppgir brukeren organisasjonsnummer.
  2. Når skjemaet er ferdig utfylt, klikker brukeren på Til signering. Det flytter prosessen til signeringssteget.
  3. Når signeringssteget starter, sjekker appen hvem som må få tillatelse til å signere (via grensesnittet ISigneeProvider).
  4. De som skal signere får de rettighetene de trenger og varsel om at de har en signeringsoppgave.
  5. Skjemaet de skal signere kommer i innboksen. De kan åpne det, se over informasjonen og signere.
  6. Brukeren som sendte inn signerer også, hvis appen er satt opp til det. Deretter sendes skjemaet inn.

Merk: Vi støtter ikke automatisk innsending ennå.

Følg trinnene under for å sette opp en slik app.

1. Legg til en signeringsoppgave i appens prosess, med tilhørende konfigurasjon

    Legg til et signeringssteg i app-prosessen

    Du må legge til et signeringssteg i prosessen til appen. Prosessen er definert i App/config/process/process.bpmn.

    Vi anbefaler at du bruker prosessdesigneren i Altinn Studio til å dra inn prosesssteget. Da får du generert et BPMN-diagram som viser flyten i appen. Prosessdesigneren konfigurerer bare steget delvis, så du må supplere med manuell konfigurasjon.

    Signering bruker to brukerhandlinger (user actions):

    • sign: Selve signeringshandlingen.
    • reject: Hvis det skal være mulig å avbryte signeringssteget, må du også legge til en gateway for å styre hvor prosessen skal gå videre når det skjer.

    Hvis appen bruker Altinn-brukergrensesnittet, vil handlingene ovenfor bli kalt ved knappetrykk i signeringssteget. Hvis appen bare bruker API-et, må du kalle disse manuelt via /actions-endepunktet eller process next.

    Et signeringssteg kan se omtrent slik ut:

    App/config/process/process.bpmn
    <bpmn:task id="SigningTask" name="Signering">
      <bpmn:extensionElements>
        <altinn:taskExtension>
          <altinn:taskType>signing</altinn:taskType>
          <altinn:actions>
          <altinn:action>sign</altinn:action>
          <altinn:action>reject</altinn:action>
          </altinn:actions>
          <altinn:signatureConfig>
            <!-- De faktiske dataene som skal signeres. Kan være vedlegg, skjemadata i xml, eller PDF fra tidligere steg. -->
            <altinn:dataTypesToSign>
              <altinn:dataType>ref-data-as-pdf</altinn:dataType>
            </altinn:dataTypesToSign>
    
            <!-- Signature-datatypen brukes for å lagre signaturene. -->
            <altinn:signatureDataType>signatures</altinn:signatureDataType>
    
            <!-- SigneeStates-datatypen brukes for å lagre de som skal signere og tilhørende informasjon. -->
            <altinn:signeeStatesDataTypeId>signeeState</altinn:signeeStatesDataTypeId>
    
            <!-- Denne ID-en angir hvilken implementasjon av C# interface-et -->
            <!-- ISigneeProvider som skal benyttes for dette signeringssteget. -->
            <altinn:signeeProviderId>founders</altinn:signeeProviderId>
    
            <!-- Her oppgis en meldingsressurs, som brukes for å si fra til de som skal signere -->
            <!-- om at de må inn og signere, samt signeringskvittering. Påkrevd. -->
            <altinn:correspondenceResource>app-correspondence-resource</altinn:correspondenceResource>
    
            <!-- Dersom man ønsker at det skal bli generert en PDF av signeringssteget -->
            <!-- så kan man oppgi en datatype her av type application/pdf. -->
            <altinn:signingPdfDataType>signing-step-pdf</altinn:signingPdfDataType> <!-- optional -->
    
            <!-- Vi har laget en standard validator som kan slås på her. -->
            <!-- Den validerer at påkrevd antall signaturer (minCount på signatur-datatypen) er oppfylt. -->
            <!-- Om denne ikke slås på, bør man skrive egen validering av signaturer. -->
            <altinn:runDefaultValidator>true</altinn:runDefaultValidator>
          </altinn:signatureConfig>
        </altinn:taskExtension>
      </bpmn:extensionElements>
      <bpmn:incoming>SequenceFlow_1oot28q</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_1if1sh9</bpmn:outgoing>
    </bpmn:task>
    

    Konfigurere miljøspesifikke meldingsressurser

    Hvis du ønsker å bruke forskjellige meldingsressurser i forskjellige miljøer, kan du legge til en env-attributt på oppsettet. Se eksempel under:

    App/config/process/process.bpmn
    <altinn:signatureConfig>
        ...
      <altinn:correspondenceResource env="Development">app-correspondence-resource-1</altinn:correspondenceResource>
      <altinn:correspondenceResource env="Staging">app-correspondence-resource-2</altinn:correspondenceResource>
      <altinn:correspondenceResource env="Production">app-correspondence-resource</altinn:correspondenceResource>
        ...
    </altinn:signatureConfig>
    

    Env-attributten godtar en rekke verdier, men kategoriserer disse til slutt i tre kategorier som vist i tabellen under. Det skilles ikke mellom store og små bokstaver i verdiene.

    MiljøAliaser
    Lokal testdevelopment, dev, local, localtest
    Teststaging, test, at22, at23, at24, tt02, yt01
    Produksjonproduction, prod, produksjon

    Legg til datatyper for å lagre signeringsdata

    Du må legge til disse datatypene i dataTypes i App/config/applicationmetadata.json.

    Signature-datatypen brukes i signeringssteget til å lagre signaturene.

    App/config/applicationmetadata.json
    {
      "id": "signatures",
      "allowedContentTypes": [
        "application/json"
      ],
      "allowedContributors": [
        "app:owned"
      ],
      "minCount": 1,
      "actionRequiredToRead": "signature-access",
      "actionRequiredToWrite": "signature-access"
    }
    

    SigneeStates-datatypen brukes for å lagre informasjon om de som skal signere og statusen deres.

    App/config/applicationmetadata.json
    {
      "id": "signeeState",
      "allowedContentTypes": [
        "application/json"
      ],
      "allowedContributors": [
        "app:owned"
      ],
      "maxCount": 1,
      "minCount": 1,
      "actionRequiredToRead": "signature-access",
      "actionRequiredToWrite": "signature-access"
    }
    

    Det er viktig å sette allowedContributors, actionRequiredToRead og actionRequiredToWrite som beskrevet i eksemplene over. Dette gjør at disse dataene ikke kan redigeres via API-et til appen, men kun av appen selv.

    Datatypenes ID-er må matche ID-ene som du legger inn i signatureDataType og signeeStatesDataTypeId i prosesskonfigurasjonen.

    Tilgangsstyring for brukere

    Gi read, write og eventuelt sign til brukeren som fyller ut skjemaet.

    Les om action-attributter i tilgangsstyring.

    Tilgangsstyring for appen

    For at appen skal kunne delegere rettigheter til de som skal signere, må appen få rettigheter til å delegere read og sign.

    Nedenfor finner du et eksempel på en slik policy. For at denne koden skal fungere i appen din, må du gjøre følgende:

    • Bytt ut ttd med riktig org.
    • Bytt ut app_ttd_signering-brukerstyrt med tilsvarende app_{org}_{appnavn}.
    • Bytt ut signering-brukerstyrt med appnavn.

    App/config/authorization/policy.xml
    <xacml:Rule RuleId="urn:altinn:org:ttd:signering-brukerstyrt:ruleid:7" Effect="Permit">
      <xacml:Description>
        A rule defining all instance delegation rights the App itself is allowed to perform for instances of the app ttd/signering-brukerstyrt.
        In this example the app can delegate the Read and Sign actions for task SigningTask.
      </xacml:Description>
      <xacml:Target>
        <xacml:AnyOf>
          <xacml:AllOf>
            <xacml:Match MatchId="urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case">
              <xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">app_ttd_signering-brukerstyrt</xacml:AttributeValue>
              <xacml:AttributeDesignator AttributeId="urn:altinn:resource:delegation" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" />
            </xacml:Match>
          </xacml:AllOf>
        </xacml:AnyOf>
        <xacml:AnyOf>
          <xacml:AllOf>
            <xacml:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
              <xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">ttd</xacml:AttributeValue>
              <xacml:AttributeDesignator AttributeId="urn:altinn:org" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" />
            </xacml:Match>
            <xacml:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
              <xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">signering-brukerstyrt</xacml:AttributeValue>
              <xacml:AttributeDesignator AttributeId="urn:altinn:app" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" />
            </xacml:Match>
            <xacml:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
              <xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">SigningTask</xacml:AttributeValue>
              <xacml:AttributeDesignator AttributeId="urn:altinn:task" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" />
            </xacml:Match>
          </xacml:AllOf>
        </xacml:AnyOf>
        <xacml:AnyOf>
          <xacml:AllOf>
            <xacml:Match MatchId="urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case">
              <xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</xacml:AttributeValue>
              <xacml:AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" />
            </xacml:Match>
          </xacml:AllOf>
          <xacml:AllOf>
            <xacml:Match MatchId="urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case">
              <xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">sign</xacml:AttributeValue>
              <xacml:AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" />
            </xacml:Match>
          </xacml:AllOf>
        </xacml:AnyOf>
      </xacml:Target>
    </xacml:Rule>
    

    Tilgangsstyring for tjenesteeiere

    Gi signature-access til tjenesteeier. Dette gjør at appen (via Maskinporten) kan skrive og lese data i signaturdokumentene. Du kan også lese og sjekke signaturer når du måtte ønske det.

    Les om begrenset tilgang til data.

    Dette steget må du gjøre manuelt. Støtte for konfigurasjon i Altinn Studio kommer senere. Se fanen Manuelt oppsett for veiledning.

    2. Legg til sider for signeringssteget

      1. Legg til en ny mappe under App/ui for signeringssteget. Mappen må ha samme navn som ID-en til oppgaven i process.bpmn, for eksempel SigningTask.

      2. I denne mappen legger du til en layouts-mappe og en Settings.json-fil.

      3. Legg til en layout-fil kalt for eksempel signing.json i layouts-mappen.

        Mappestrukturen skal se slik ut:

        App/
        ├── ui/
        │   └── SigningTask/
        │       ├── layouts/
        │       │   └── signing.json
        │       └── Settings.json
        
      4. Legg til innhold i layout-filen.

        Det finnes et sett med ferdige komponenter for å bygge opp layout for et signeringssteg. Vi anbefaler å bruke disse, men de er ikke obligatoriske:

        Hvis du ikke bruker SigningActions for å vise Signer-knappen, må du legge til en egen action button med action “sign” for å la sluttbruker signere.

        Eksempel på bruk av komponentene:

        App/ui/SigningTask/layouts/signing.json
        {
          "$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
          "data": {
            "layout": [
              {
                "id": "headerSigningFounders",
                "type": "Heading",
                "size": "M",
                "textResourceBindings": {
                  "title": "Her kan man ha en overskrift"
                }
              },
              {
                "id": "signee-list",
                "type": "SigneeList",
                "textResourceBindings": {
                  "title": "Personer som skal signere",
                  "description": "Personer som skal signere beskrivelse",
                  "help": "Dette er personer som skal signere"
                }
              },
              {
                "id": "signing-documents",
                "type": "SigningDocumentList",
                "textResourceBindings": {
                  "title": "Dokumenter som skal signeres",
                  "description": "Dokumenter som skal signeres beskrivelse"
                }
              },
              {
                "id": "signing-state",
                "type": "SigningActions"
              }
            ]
          }
        }
        
      5. Sett defaultDataType i Settings.json til datamodellen som signeringsoppgaven skal bruke, og legg layout-filen i pages.order:

        App/ui/SigningTask/Settings.json
        {
          "$schema": "https://altinncdn.no/schemas/json/layout/layoutSettings.schema.v1.json",
          "defaultDataType": "model",
          "pages": {
            "order": ["signing"]
          }
        }
        

      Dette steget må du gjøre manuelt. Støtte for konfigurasjon i Altinn Studio kommer senere. Se fanen Manuelt oppsett for veiledning.

      3. Valgfritt - Egendefinert validering

      Du kan bruke standardvalidatoren som nevnt i punkt 2. Den sjekker at antall signaturer er minst det som er satt til minCount på feltet i datamodellen. Du kan sette opp egendefinert validering ved å implementere IValidator eller ITaskValidator, som beskrevet i Lage validatorer i C#.

      Hvis appen er konfigurert slik at signeringshandlingen gjøres i prosessnavigasjonen, vil handlingen gjøres før valideringen.

      Et eksempel er en validator som sjekker at en signatur er gjort på vegne av en organisasjon:

      public class SigningTaskValidator : IValidator
      {
        private readonly IProcessReader _processReader;
      
        public SigningTaskValidator(IProcessReader processReader)
        {
          _processReader = processReader;
        }
      
        /// <summary>
        /// We implement <see cref="ShouldRunForTask"/> instead.
        /// </summary>
        public string TaskId => "*";
      
        /// <summary>
        /// Only runs for tasks that are of type "signing".
        /// </summary>
        public bool ShouldRunForTask(string taskId)
        {
          AltinnTaskExtension? taskConfig;
          try
          {
            taskConfig = _processReader.GetAltinnTaskExtension(taskId);
          }
          catch (Exception)
          {
            return false;
          }
      
          return taskConfig?.TaskType == "signing";
        }
      
        public bool NoIncrementalValidation => true;
      
        /// <inheritdoc />
        public Task<bool> HasRelevantChanges(IInstanceDataAccessor dataAccessor, string taskId, DataElementChanges changes)
        {
          throw new UnreachableException(
            "HasRelevantChanges should not be called because NoIncrementalValidation is true."
          );
        }
      
        /// <inheritdoc />
        /// <remarks>Validates that at minimum one signature is done on behalf of an organisation.</remarks>
        public async Task<List<ValidationIssue>> Validate(
          IInstanceDataAccessor instanceDataAccessor,
          string taskId,
          string? language
        )
        {
          AltinnSignatureConfiguration signatureConfiguration =
            _processReader.GetAltinnTaskExtension(taskId)?.SignatureConfiguration
            ?? throw new ApplicationConfigException("Signing configuration not found in AltinnTaskExtension");
      
          string signatureDataTypeId =
            signatureConfiguration.SignatureDataType
            ?? throw new ApplicationConfigException("SignatureDataType is not set in the signature configuration.");
      
          DataType signatureDataType = instanceDataAccessor.GetDataType(signatureDataTypeId);
      
          // Set authentication override for the signature data, since this is a restricted type
          instanceDataAccessor.OverrideAuthenticationMethod(signatureDataType, StorageAuthenticationMethod.ServiceOwner());
      
          IEnumerable<DataElement> signatureDataElements = instanceDataAccessor.GetDataElementsForType(
            signatureDataType
          );
      
          SignDocument[] signDocuments = await Task.WhenAll(
            signatureDataElements.Select(async signatureDataElement =>
            {
              ReadOnlyMemory<byte> data = await instanceDataAccessor.GetBinaryData(signatureDataElement);
              string signDocumentSerialized = Encoding.UTF8.GetString(data.ToArray());
      
              return JsonSerializer.Deserialize<SignDocument>(signDocumentSerialized)
                ?? throw new JsonException("Could not deserialize signature document.");
            })
          );
      
          var organisationHasSigned = signDocuments.Any(doc => doc?.SigneeInfo?.OrganisationNumber is not null);
      
          if (organisationHasSigned is false)
          {
            return
            [
              new ValidationIssue
              {
                Code = "SignatureIssues",
                Severity = ValidationIssueSeverity.Error,
                Description = "An organisation must sign the document.",
              },
            ];
          }
          return [];
        }
      }
      

      4. Oppgi hvem som skal signere

        For at appen skal vite hvem som skal få tilganger for å lese og signere, må du implementere C#-grensesnittet ISigneeProvider.

        Grensesnittet må returnere et sett med personer og/eller virksomheter som skal få rettighetene. Det kan for eksempel være basert på datamodellen, som vist nedenfor. Id-attributtet i denne implementasjonen må matche ID-en som ble angitt i <altinn:signeeProviderId>.

        Når en organisasjon er oppgitt som den som skal signere, vil de som har en nøkkelrolle i organisasjonen få read og sign-rettigheter til instansen.

        App/logic/FounderSigneesProvider.cs
        #nullable enable
        using System.Collections.Generic;
        using System.Linq;
        using System.Threading.Tasks;
        using Altinn.App.Core.Features;
        using Altinn.App.Core.Features.Signing;
        using Altinn.App.Models.Skjemadata;
        using Altinn.Platform.Storage.Interface.Models;
        
        namespace Altinn.App.logic;
        
        public class FounderSigneesProvider : ISigneeProvider
        {
          public string Id { get; init; } = "founders";
        
          public async Task<SigneeProviderResult> GetSignees(GetSigneesParameters parameters)
          {
            DataElement dataElement = parameters.InstanceDataAccessor
              .GetDataElementsForType("Skjemadata")
              .Single();
        
            var formData = await parameters.InstanceDataAccessor.GetFormData<Skjemadata>(dataElement);
        
            List<ProvidedSignee> providedSignees = [];
            foreach (StifterPerson stifterPerson in formData.StifterPerson)
            {
              var personSignee = new ProvidedPerson
              {
                FullName = string.Join(
                  " ",
                  [stifterPerson.Fornavn, stifterPerson.Mellomnavn, stifterPerson.Etternavn]
                ),
                SocialSecurityNumber = stifterPerson.Foedselsnummer?.ToString() ?? string.Empty,
        
                // CommunicationConfig added here is optional, shown and described in section 6
              };
        
              providedSignees.Add(personSignee);
            }
        
            foreach (StifterVirksomhet stifterVirksomhet in formData.StifterVirksomhet)
            {
              var organisationSignee = new ProvidedOrganization
              {
                Name = stifterVirksomhet.Navn,
                OrganizationNumber =
                  stifterVirksomhet.Organisasjonsnummer?.ToString() ?? string.Empty,
        
                // CommunicationConfig added here is optional, shown and described in section 6
              };
        
              providedSignees.Add(organisationSignee);
            }
        
            return new SigneeProviderResult { Signees = providedSignees };
          }
        }
        

        Dette steget må du gjøre manuelt. Støtte for konfigurasjon i Altinn Studio kommer senere. Se fanen Manuelt oppsett for veiledning.

        5. Valgfritt - Legg til tekstressurser

        Denne seksjonen er bare relevant hvis du vil endre standardtekstene som brukes når vi kommuniserer med de som skal signere.

        Disse standardverdiene brukes hvis du ikke endrer kommunikasjonstekstene:

          TekstStandardVerdi
          Innboksmelding til den som signerer - tittel“{appName}: Oppgave til signering”
          Innboksmelding til den som signerer - undertittel“Din signatur ventes for {appName}.”
          Innboksmelding til den som signerer - innhold“Du har en oppgave som venter på din signatur. <a href="{instanceUrl}">Klikk her for å åpne applikasjonen.

          Hvis du lurer på noe, kan du kontakte {appOwner}.”
          Sms til den som signerer - innhold“Din signatur ventes for {appName}. Åpne Altinn-innboksen din for å fortsette.”
          E-post til den som signerer - emne“{appName}: Oppgave til signering”
          E-post til den som signerer - innhold“Din signatur ventes for {appName}. Åpne Altinn-innboksen din for å fortsette.

          Hvis du lurer på noe, kan du kontakte {appOwner}.”
          Kvittering til den som signerer - tittel“{appName}: Signeringen er bekreftet”
          Kvittering til den som signerer - undertittel“Du har signert for {appName}.”
          Kvittering til den som signerer - innhold“Dokumentene du har signert er vedlagt. Disse kan lastes ned om ønskelig.

          Hvis du lurer på noe, kan du kontakte {appOwner}.”
          TekstStandardVerdi
          Innboksmelding til den som signerer - tittel“{appName}: Oppgåve til signering”
          Innboksmelding til den som signerer - undertittel“Signaturen din vert venta for {appName}.”
          Innboksmelding til den som signerer - innhold“Du har ei oppgåve som ventar på signaturen din. <a href="{instanceUrl}">Klikk her for å opne applikasjonen.

          Om du lurer på noko, kan du kontakte {appOwner}.”
          Sms til den som signerer - innhold“Signaturen din vert venta for {appName}. Opne Altinn-innboksen din for å gå vidare.”
          E-post til den som signerer - emne“{appName}: Oppgåve til signering”
          E-post til den som signerer - innhold“Signaturen din vert venta for {appName}. Opne Altinn-innboksen din for å gå vidare.

          Om du lurer på noko, kan du kontakte {appOwner}.”
          Kvittering til den som signerer - tittel“{appName}: Signeringa er stadfesta”
          Kvittering til den som signerer - undertittel“Du har signert for {appName}.”
          Kvittering til den som signerer - innhold“Dokumenta du har signert er vedlagde. Dei kan lastast ned om ønskeleg.

          Om du lurer på noko, kan du kontakte {appOwner}.”
          TekstStandardVerdi
          Innboksmelding til den som signerer - tittel“{appName}: Task for signing”
          Innboksmelding til den som signerer - undertittel“Your signature is requested for {appName}.”
          Innboksmelding til den som signerer - innhold“You have a task waiting for your signature. <a href="{instanceUrl}">Click here to open the application.

          If you have any questions, you can contact {appOwner}.”
          Sms til den som signerer - innhold“Your signature is requested for {appName}. Open your Altinn inbox to proceed.”
          E-post til den som signerer - emne“{appName}: Task for signing”
          E-post til den som signerer - innhold“Your signature is requested for {appName}. Open your Altinn inbox to proceed.

          If you have any questions, you can contact {appOwner}.”
          Kvittering til den som signerer - tittel“{appName}: Signature confirmed”
          Kvittering til den som signerer - undertittel“Your signature has been registered for {appName}.”
          Kvittering til den som signerer - innhold“The signed documents are attached. They may be downloaded.

          If you have any questions, you can contact {appOwner}.”

            Hvis du vil endre standardtekstene, legger du til en tekstressurs-fil under App/config/texts for hvert språk du vil støtte.

            Med CommunicationConfig-oppsettet for en person som skal signere i implementasjonen av ISigneeProvider-grensesnittet, kan du knytte opp tekstressurser for å endre innholdet i melding til innboksen i Altinn, samt sms og e-postmeldinger som sendes for å varsle den som skal signere om en signeringsoppgave. Disse kan du kalle hva du vil og koble dem opp til CommunicationConfig i neste punkt (punkt 4).

            Eksempel på tekstressurser for varsling med egne tekster for e-postmeldinger, samt kvittering:

            Legg merke til at tekstressursene for innhold i innboksen i Altinn har en $instanceUrl$-plassholder (placeholder). Altinn erstatter den automatisk med en lenke til skjemaet. Hvis du endrer dette uten å bruke denne plassholderen, vil IKKE mottakeren kunne finne frem til skjemaet med signeringsoppgaven.
            App/config/texts/resource.{language}.json
            {
              "id": "signing.correspondence_title_common",
              "value": "Task - Sign founding documents"
            },
            {
              "id": "signing.correspondence_summary_stifter_person",
              "value": "You have been added as a signee."
            },
            {
              "id": "signing.correspondence_summary_stifter_organisation",
              "value": "The organisation has been added as a signee."
            },
            {
              "id": "signing.correspondence_body_stifter_person",
              "value": "You have been added as a signee for founding documents. <br /> $instanceUrl$ <br /><br />"
            },
            {
              "id": "signing.correspondence_body_stifter_organisation",
              "value": "Your organisation has been added as a signee for founding documents. <br /> $instanceUrl$ <br /><br />"
            },
            {
              "id": "signing.notification_content",
              "value": "Hello $correspondenceRecipientName$,\n\nYou have received founding documents for signing in Altinn. Log in to Altinn to sign the documents.\n\nBest regards,\nBrønnøysund Register Centre"
            },
            {
              "id": "signing.email_subject",
              "value": "Founding documents received for signing in Altinn. Go to Altinn inbox to sign."
            },
            

            Du kan ikke endre kvitteringen per person som skal signere, bare generelt for alle. Her må tekstressursene ha disse nøklene for at endringen skal fungere:

            • signing.correspondence_receipt_title - tittel på kvitteringsmelding
            • signing.correspondence_receipt_summary - undertittel på kvitteringsmelding
            • signing.correspondence_receipt_body - innhold i kvitteringsmelding
            App/config/texts/resource.{language}.json
            {
              "id": "signing.correspondence_receipt_title",
              "value": "Receipt: Signing of founding documents"
            },
            {
              "id": "signing.correspondence_receipt_summary",
              "value": "You have signed the founding documents"
            },
            {
              "id": "signing.correspondence_receipt_body",
              "value": "The documents you have signed are attached. These can be downloaded if desired. <br /><br />If you have any questions, contact the Brønnøysund Register Centre at phone 75 00 75 00."
            }
            

            Dette steget må du gjøre manuelt. Støtte for konfigurasjon i Altinn Studio kommer senere. Se fanen Manuelt oppsett for veiledning.

            6. Valgfritt - Tilpass hvordan de som skal signere varsles

            CommunicationConfig er valgfritt. Her kan du endre standardtekstene som brukes i kommunikasjon med de som skal signere, som beskrevet i forrige punkt. Du kan også endre e-postadresse og telefonnummer for de som skal signere.

            Hvis CommunicationConfig ikke er satt, sendes en melding til innboksen i Altinn med en lenke til applikasjonsinstansen, og et varsel sendes bare på e-post, med Altinns generiske varslingsmal.
            Vil du varsle på SMS, eller bruke standardtekstene for SMS og e-post fra forrige punkt, må du sette CommunicationConfig.NotificationChoice. Hvis den ikke er satt, avgjøres kanalen av Notification.Email.EmailAddress og Notification.Sms.MobileNumber, og når ingen av dem har verdi, sendes bare den generiske e-posten. Det holder å sette NotificationChoice for å bruke standardtekstene og den registrerte kontaktinformasjonen.

            Hvis du ikke endrer e-postadresser og telefonnumre, hentes de som beskrevet i Recipient lookup og Address lookup.

            Dette kan du endre i kommunikasjonen med de som skal signere:

            PropertyDescriptionType
            CommunicationConfigObjektet for kommunikasjonskonfigurasjonObject
            CommunicationConfig.NotificationChoiceHvilken kanal det varsles på: Email, Sms, SmsAndEmail, SmsPreferred eller EmailPreferredNotificationChoice enum
            CommunicationConfig.InboxMessageObjektet for innboksmeldingskonfigurasjonObject
            CommunicationConfig.InboxMessage.TitleTextResourceKeyTekstressursnøkkelen for innboksmeldingstittelString
            CommunicationConfig.InboxMessage.SummaryTextResourceKeyTekstressursnøkkelen for innboksmeldingssammendragString
            CommunicationConfig.InboxMessage.BodyTextResourceKeyTekstressursnøkkelen for innboksmeldingsinnholdString
            CommunicationConfig.NotificationObjektet for varslingskonfigurasjonObject
            CommunicationConfig.Notification.EmailObjektet for e-postvarslingObject
            CommunicationConfig.Notification.Email.EmailAddressOverstyrer e-postadressen. Hvis den ikke er satt, brukes registrert kontaktinformasjonString
            CommunicationConfig.Notification.Email.SubjectTextResourceKeyTekstressursnøkkelen for e-postemneString
            CommunicationConfig.Notification.Email.BodyTextResourceKeyTekstressursnøkkelen for e-postinnholdString
            CommunicationConfig.Notification.SmsObjektet for SMS-varslingObject
            CommunicationConfig.Notification.Sms.MobileNumberOverstyrer mobilnummeret. Hvis det ikke er satt, brukes registrert kontaktinformasjonString
            CommunicationConfig.Notification.Sms.BodyTextResourceKeyTekstressursnøkkelen for SMS-innholdString
            CommunicationConfig.ReminderNotificationHvis satt, sendes en påminnelse til de som ikke har signert. Samme struktur som Notification, men bare tekstressursnøklene brukesObject

              Her er et eksempel på hvordan du endrer kommunikasjon med en ProvidedPerson, det samme gjelder for ProvidedOrganization:

              App/logic/FounderSigneesProvider.cs
              // Minimal: notify by SMS and email using the default texts and the
              // registered contact information of the signee.
              var minimalSignee = new ProvidedPerson
              {
                  FullName = fullName,
                  SocialSecurityNumber = socialSecurityNumber,
                  CommunicationConfig = new CommunicationConfig
                  {
                      NotificationChoice = NotificationChoice.SmsAndEmail,
                  },
              };
              
              // Full override of texts and contact information.
              var personSignee = new ProvidedPerson
              {
                  FullName = fullName,
                  SocialSecurityNumber = socialSecurityNumber,
                  CommunicationConfig = new CommunicationConfig
                  {
                      InboxMessage = new InboxMessage
                      {
                          TitleTextResourceKey = "signing.correspondence_title_common",
                          SummaryTextResourceKey = "signing.correspondence_summary_stifter_person",
                          BodyTextResourceKey = "signing.correspondence_body_stifter_person",
                      },
                      Notification = new Notification
                      {
                          Email = new Email
                          {
                              EmailAddress = stifterPerson.Epost,
                              SubjectTextResourceKey = "signing.email_subject",
                              BodyTextResourceKey = "signing.notification_content",
                          },
                          Sms = new Sms
                          {
                              MobileNumber = stifterPerson.Mobiltelefon,
                              BodyTextResourceKey = "signing.notification_content",
                          },
                      },
                      // Optional: send a reminder if the signee has not acted. Uses the default reminder texts.
                      ReminderNotification = new Notification(),
                      NotificationChoice = NotificationChoice.EmailPreferred,
                  },
              };
              

              Dette steget må du gjøre manuelt. Støtte for konfigurasjon i Altinn Studio kommer senere. Se fanen Manuelt oppsett for veiledning.

              7. Test brukerstyrt signering

              SMS-varsler er ikke tilgjengelige i TT02 eller andre testmiljøer. Hvis du bruker SMS, vil det føre til en “varsling mislyktes”-status i SigneeList-komponenten. Den som skal signere vil likevel få en melding i Altinn-innboksen.

              Det er caching i autorisasjonslaget som gjør at det kan ta tid før en bruker som har fått tilgang til et skjema via brukerstyrt signering ser skjemaet i Altinn-innboksen.

              Dette gjelder bare for brukere som

              • er aktivt pålogget Altinn når vi gir dem tilgang
              • ikke allerede har annen tilgang for InstanceOwner

              For å unngå dette under testing kan du gi tilgang til en person du ikke har brukt i testing den siste timen.