Instantiation

How to add logic to be run when a new instance is created?

On this page:

Introduksjon

Applikasjonslogikk knyttet til instansiering kan defineres i InstantiationHandler.cs. For en helt ny app vil det være to funksjoner implementert i denne klassen:

  • RunInstantiationValidation - lag egne sjekker for å avgjøre om en bruker/avgiver får lov til å instansiere.
  • DataCreation - lag tilpasset prefill data.

Egendefinerte valideringsregler for instansiering

Som tidligere nevnt, kan sjekker for instansiering defineres i RunInstantiationValidation. Tilgang til Register- og Profile-tjenester er inkludert i InstantiationHandler.cs-filen, som tillater å gjøre sjekker mot disse. Valideringsregler for instansiering kan innebære å validere tidspunkt til spesifikke brukerrestriksjoner og komplekse sjekker som krever eksterne API-kall.

Eksempel 1 - Insansiering kun tillatt før kl 15:00 på en gitt dag

public async Task<InstantiationValidationResult> RunInstantiationValidation(Instance instance)
{
    DateTime now = DateTime.Now;
    if (now.Hour < 15)
    {
        return new InstantiationValidationResult()
        {
            Valid = false,
            Message = "ERROR: Instantiation not possible before 3PM."
        };
    }

    return null;
}

Eksempel 2 - Instansiering kun tillatt for applikasjonseier

Kodebasen som eksempelet er basert på er tilgjengelig her. (krever innlogging i altinn.studio)

For å kunne begrense instansiering til en gitt entitet, i dette tilfellet applikasjonseier, er det to filer som må endres: App.cs og InstantiationHandler.cs.

Changes to app.cs

Changes to app.cs

I App.cs tilgjengeliggjøres http-konteksten og brukerdata (claims principals) hentes ut fra konteksten ved å kalle _httpContext.User.

For å validere instansieringen kan man sjekke ett av to claims i konteksten. Enten organisasjonsen trebokstavsforkortelse eller organisasjonsnummeret. Valideringen skjer i InstantiationHandler.cs og eksempelet nedenfor bruker organisasjonsforkortelsen.

For å validere basert på organisasjonsnummer kan du følge eksempelet nedenfor, og bytte ut AltinnCoreClaimTypes.Org med AltinnCoreClaimTypes.OrgNumber.
om må gjøres i denne file ser du nedenfor.

InstantiationHandler.cs

Changes to instantiationHandler.cs

public async Task<InstantiationValidationResult> RunInstantiationValidation(Instance instance, ClaimsPrincipal user)
{
    var result = new InstantiationValidationResult();
    string org = string.Empty;

    if (user.HasClaim(c => c.Type == AltinnCoreClaimTypes.Org))
    {
        Claim orgClaim =
          user.FindFirst(c => c.Type == AltinnCoreClaimTypes.Org);
          
        if (orgClaim != null)
        {
            org = orgClaim.Value;
        }
    }

    if (!string.IsNullOrWhiteSpace(org) && org.Equals("ttd"))
    {
        result.Valid = true;
    }
    else
    {
        result.Valid = false;
        result.Message =
          "Only ttd is allowed to instantiate this application.";
    }

    return await Task.FromResult(result);
}

Eksempel 3 - Instansiering kun tillatt mellom gitte datoer

For å kunne begrense instansiering til en gitt tidsrom, i dette eksempelet januar 2021, er det én fil som må endres:InstantiationHandler.cs.

Metoden RunInstantiationValidation vil kjøre hver gang noen prøver å instansiere applikasjonen, så her plasseres logikk for å verifiere at tidspunktet er innenfor den tillatte rammen.

public async Task<InstantiationValidationResult> RunInstantiationValidation(Instance instance)
{
    InstantiationValidationResult result = null;
    DateTime now = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"));
    if (now < new DateTime(2021, 01, 01))
    {
        result = new InstantiationValidationResult
        {
            Valid = false,
            Message = "Application cannot be instantiated before 1.1.2021"
        };
    }
    else if (now > new DateTime(2021, 01, 31))
    {
        result = new InstantiationValidationResult
        {
            Valid = false,
            Message = "Application cannot be instantiated after 25.1.2021"
        };
    }
    return await Task.FromResult(result);
}

Det er lagt inn logikk knyttet til datohåndtering for å forsikre oss om at det er norsk tid som gjelder og som blir brukt i valideringen.

DateTime now = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"));

Videre gjøres det en enkel sjekk for å se om nåværende tidspunkt er innenfor rammene

(now < new DateTime(2021, 01, 01)

Dersom man ikke oppfyller kravene blir returobjektet populert med et InstantiationValidationResult objekt som inneholder to felter: Valid: en boolean som benyttes for å si om instansieringen er gyldig eller ikke Message: en string som kan inneholde en feilmelding dersom det ikke er gyldig

 result = new InstantiationValidationResult
        {
            Valid = false,
            Message = "Application cannot be instantiated before 1.1.2021"
        };

I tillegg har man muligheten til å legge benytte property ValidParties: en liste med de partiene som kan instansiere applikasjonen.

Resultatet av en feilet validering er vist nedenfor:

Instansiering før tillatt dato

Instansiering før tillatt dato

Instansiering etter tillatt dato

Instansiering etter tillatt dato