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.

Lage egne regler for å starte appen

Slik lager du egne regler som avgjør om brukeren kan starte appen.

I tillegg til å velge aktørtyper under Innstillinger → Oppstartskontroll kan du lage egne regler i koden, for eksempel at brukerne bare kan starte appen i en bestemt periode.

Når regelen kjører

Appen kjører regelen

  • når brukeren starter appen og appen oppretter en ny instans
  • når brukeren starter en instans fra en stateless visning
  • når brukeren lager en kopi av en instans fra innboksen
  • når tjenesteeieren eller et system oppretter en instans via API-et

Når brukeren lager en kopi fra innboksen, kontrollerer ikke appen aktørtypene. Appen kjører først regelen din, og deretter ICopyInstanceValidator hvis du har registrert den. Stopper en av dem kopien, viser appen meldingen fra den regelen.

Appen bruker bare én regel. Registrerer du flere, er det den siste som gjelder.

Lage en regel

  1. Lag en klasse som implementerer IInstantiationValidator. Returner null når brukeren kan starte appen. Når brukeren ikke kan det, returnerer du et InstantiationValidationResult med Valid = false og en melding.
  2. Registrer klassen i RegisterCustomAppServices i App/Program.cs.

Eksempel: bare i en bestemt periode

Regelen lar brukerne starte appen i januar 2027, etter norsk tid.

App/logic/OpeningPeriodValidator.cs
using Altinn.App.Core.Features;
using Altinn.App.Core.Models.Validation;
using Altinn.Platform.Storage.Interface.Models;

namespace Altinn.App.logic;

public class OpeningPeriodValidator : IInstantiationValidator
{
    private static readonly TimeZoneInfo NorwegianTime = TimeZoneInfo.FindSystemTimeZoneById("Europe/Oslo");
    private static readonly DateTime OpensAt = new(2027, 1, 1);
    private static readonly DateTime ClosesAt = new(2027, 2, 1);

    public Task<InstantiationValidationResult?> Validate(Instance instance)
    {
        DateTime now = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, NorwegianTime);

        if (now < OpensAt)
        {
            return Task.FromResult<InstantiationValidationResult?>(
                new() { Valid = false, Message = "Du kan starte tjenesten fra 1. januar 2027." }
            );
        }

        if (now >= ClosesAt)
        {
            return Task.FromResult<InstantiationValidationResult?>(
                new() { Valid = false, Message = "Fristen for å starte tjenesten var 31. januar 2027." }
            );
        }

        return Task.FromResult<InstantiationValidationResult?>(null);
    }
}
App/Program.cs
using Altinn.App.logic;

// ...

void RegisterCustomAppServices(IServiceCollection services, IConfiguration config, IWebHostEnvironment env)
{
    services.AddTransient<IInstantiationValidator, OpeningPeriodValidator>();
}

Eksempel: bare tjenesteeieren

Regelen lar bare tjenesteeieren starte appen, for eksempel når tjenesteeieren oppretter instanser via API-et. Bytt ut ttd i eksempelet under med koden til virksomheten din.

App/logic/ServiceOwnerOnlyValidator.cs
using Altinn.App.Core.Features;
using Altinn.App.Core.Features.Auth;
using Altinn.App.Core.Models.Validation;
using Altinn.Platform.Storage.Interface.Models;

namespace Altinn.App.logic;

public class ServiceOwnerOnlyValidator(IAuthenticationContext authenticationContext) : IInstantiationValidator
{
    public Task<InstantiationValidationResult?> Validate(Instance instance)
    {
        if (authenticationContext.Current is Authenticated.ServiceOwner { Name: "ttd" })
        {
            return Task.FromResult<InstantiationValidationResult?>(null);
        }

        return Task.FromResult<InstantiationValidationResult?>(
            new() { Valid = false, Message = "Bare tjenesteeieren kan starte denne tjenesten." }
        );
    }
}

Siden om autentisering har et eksempel på en regel som bare slipper inn brukere som er logget inn i Altinn-portalen.

Meldingen på flere språk

Vil du at meldingen skal følge språket til brukeren, bruker du CustomTextKey i stedet for Message. Appen henter da teksten fra tekstressursene. Med CustomTextParameters kan du sette inn verdier i teksten. Les mer om variabler i tekster.

App/logic/OpeningPeriodValidator.cs
return Task.FromResult<InstantiationValidationResult?>(
    new()
    {
        Valid = false,
        CustomTextKey = "instantiation.closed",
        CustomTextParameters = new() { ["deadline"] = "31.01.2027" },
    }
);
App/config/texts/resource.nb.json
{
  "id": "instantiation.closed",
  "value": "Fristen for å starte tjenesten var {0}.",
  "variables": [
    {
      "key": "deadline",
      "dataSource": "customTextParameters"
    }
  ]
}

Legg inn teksten med samme nøkkel i ressursfilen for hvert språk appen støtter, for eksempel resource.nn.json og resource.en.json.

Hva brukeren ser

  • Når brukeren starter appen direkte, viser appen en egen feilside med overskriften «Du kan ikke starte denne tjenesten», meldingen din og telefonnummeret til brukerservice i Altinn.
  • Når brukeren starter en instans fra en stateless visning, blir brukeren værende på siden, og appen viser meldingen i en feilrapport.
  • Når brukeren lager en kopi fra innboksen, viser appen en enkel side med meldingen.
  • Via API-et svarer appen med 403 Forbidden og resultatet fra regelen som JSON.