Gå til innhold

Microsoft 365-integrasjon

Microsoft 365 (tidligere Office 365) integreres mot ePortal for innlogging (Entra ID via MSAL), e-post-integrasjon (Outlook-addin), dokumentlagring (SharePoint), kalender og kommunikasjon (Teams). I tillegg står Microsoft Graph for utgående e-post (via GraphEmailSender) når Freshdesk-fallback aktiveres.

Type: OAuth 2.0 (Microsoft Entra ID), Microsoft Graph API. Frontend bruker MSAL.js for innlogging. Backend bruker client-credentials + on-behalf-of mot Graph. Modul i ePortal: App-registrering hos kunden. Backend-credentials lagres i wv_SystemConfiguration under kategori Microsoft365. Frontend-credentials lagres i runtime-config (AppConfig). Implementasjon: MicrosoftGraphAuthService.cs, BaseGraphAdapter.cs, Migration_20260227200000.cs


Hva integrasjonen tilbyr

Funksjon Hva Konfigurasjon
Entra ID-pålogging (MSAL) "Logg inn med Microsoft" på login-skjermen Runtime-config (msalClientId/msalTenantId/msalAuthority/msalScopes i AppConfig)
Outlook-addin Loggføre e-post og møter fra Outlook mot CRM-kunde/avtale Egen CrmOutlookController + addin-manifest distribuert via Microsoft Admin
SharePoint-dokumenter Bla og søke i SharePoint fra ePortal, koble til CRM/Prosjekt/HMS App-only-token via MicrosoftGraphAuthService + per-entitet kobling i SharePointConnectionController
Microsoft Planner-sync Synker prosjekt-oppgaver til Microsoft Planner-planer Dedikert adapter — se Microsoft Planner-oppsett
Microsoft To Do-sync Synker personlige oppgaver til brukerens To Do-app Dedikert adapter — se Microsoft To Do-oppsett
Graph e-post-utsending GraphEmailSender sender e-post via Graph API (bruker M365Graph.*-credentials) Brukes som fallback for Freshdesk, KAI bug-rapport og varslinger

Disse er uavhengige — du kan aktivere én uten å aktivere de andre. Hovedbryteren M365Graph.Enabled styrer om backend Graph-tjenester er aktive.


Tilgang

Hvem Hva trengs
Hos kunden Microsoft 365-tenant + administrator-konto for Entra ID
Hos Konti Administrator-tilgang til Konti Connect + tilgang til Azure for app-registrering
Per bruker Hver ePortal-bruker som vil bruke Outlook addin/SharePoint må selv autorisere første gang

Forutsetninger

  • Microsoft 365-abonnement aktivt (Business eller Enterprise)
  • Entra ID-tilgang for administrator (i kundens tenant)
  • Microsoft Graph API-tilgang aktivert
  • Hvis Outlook-addin brukes: tilgang til Microsoft Admin → Apps for å distribuere addin

Konfigurasjon — feltforklaring

Backend (wv_SystemConfiguration, kategori Microsoft365)

Seedet av Migration_20260227200000.cs og lest av MicrosoftGraphAuthService.cs:58-60.

ConfigKey Type Påkrevd Hva det betyr
M365Graph.TenantId String (GUID) Ja Kundens Azure AD Tenant-ID. Bygger token-URL https://login.microsoftonline.com/{TenantId}/oauth2/v2.0/token
M365Graph.ClientId String (GUID) Ja Application (Client) ID for app-registreringen i Entra ID
M365Graph.ClientSecret Passord (kryptert) Ja Client Secret fra app-registreringen. IsEncrypted=1
M365Graph.DefaultGroupId String (GUID) Nei Default M365 Group ID som Planner-planer opprettes mot — brukes av PlannerSyncAdapter.cs:135
M365Graph.Enabled Boolean Ja (default false) Hovedbryter. Når false returnerer Graph-adaptere en warning og hoppes over (BaseGraphAdapter.cs:55-61)

Auth-flyt på backend:

  • App-only: client_credentials mot /oauth2/v2.0/token, scope https://graph.microsoft.com/.default. Token caches i 50 minutter (MicrosoftGraphAuthService.cs:33, 101-142)
  • On-Behalf-Of (OBO): Når en bruker har logget inn via MSAL og frontend trenger Graph-data i brukerens kontekst, byttes brukerens access-token til et OBO-token mot Graph (MicrosoftGraphAuthService.cs:150-195)
  • Token-cachen er isolert per kunde og per bruker: hver mellomlagret token ligger under en nøkkel som er avledet av selve påloggingskonteksten — Entra-tenant, klient-ID og klienthemmelighet for app-only-tokenet, og i tillegg brukerens eget access-token for OBO-tokenet (GraphTokenCacheIdentity.cs). Applikasjonen deler ett minne-mellomlager på tvers av alle kundemiljøer i samme prosess, så en kunde kan ikke få servert en annen kundes token, og to brukere deler ikke OBO-token. En konfigurasjon som oppgir riktig klient-ID med feil klienthemmelighet treffer ikke mellomlageret — hemmeligheten må bekreftes mot Entra ID før et token utleveres. Ufullstendig M365Graph.*-konfigurasjon avvises før et kall gjøres.
  • 401-håndtering: Token-cachen invalideres ved 401-feil — neste kall henter friskt token (BaseGraphAdapter.cs:66-71). Invalideringen treffer kun kundemiljøet som fikk 401 (MicrosoftGraphAuthService.cs:228-243); OBO-tokener tømmes ikke her, de utløper på sin egen 50-minutters levetid.

Frontend (runtime-config, AppConfig)

Feltene defineres i ui/ePortal.ui/src/app/models/app-config.ts (linjene 30-54) og leses av MSAL-oppsettet i Angular:

Felt Type Påkrevd Hva det betyr
msalClientId String (GUID) Nei Overstyrer default fra environment.msalConfig. Brukes som MSAL clientId
msalTenantId String (GUID) Nei Brukes for å bygge authority = https://login.microsoftonline.com/{tenantId}/v2.0. Har forrang over msalAuthority
msalAuthority String (URL) Nei Full MSAL authority. Ignoreres hvis msalTenantId er satt
msalScopes String-liste Nei Token-scopes (typisk ["openid", "profile", "email", "User.Read"])

Hvis ikke satt brukes default fra environment.msalConfig. Runtime-config lar deg kjøre samme ePortal-build mot flere tenant-Entra-konfigurasjoner uten ny build.

Påkrevde Graph API-permissions

Avhengig av hvilke funksjoner som aktiveres:

Funksjon API permissions (Application / Delegated)
Innlogging openid, profile, email, User.Read (delegated)
Outlook-addin (CRM-logging) Mail.Read, Mail.ReadWrite, Calendars.ReadWrite (delegated)
SharePoint-koblinger Sites.Read.All eller Sites.ReadWrite.All (application — app-only via Graph)
Planner-sync Group.ReadWrite.All, Tasks.ReadWrite.All (application)
To Do-sync Tasks.ReadWrite.All (application)
Graph e-post-utsending Mail.Send (application)

Alle application-permissions må gis "admin consent" i Entra ID-portalen før første kjøring.


Slik gjør du — Entra ID-pålogging (frontend)

1. Registrer ePortal som app i Entra ID

I Entra ID Admin → App registrations:

  • Ny registrering: "ePortal Login"
  • Redirect URI: https://<tenant>.eportal.no/login (single-page application — SPA-platform i Entra)
  • Tillat ID-token + Access-token

2. Konfigurer permissions

Tildel API permissions under "Microsoft Graph":

  • openid, profile, email, User.Read (delegated)
  • Klikk "Grant admin consent for " — påkrevd for at innlogging skal fungere uten samtykke-popup per bruker

3. Sett Client ID + Tenant ID i ePortal runtime-config

I ui/ePortal.ui/configs/<env>.config.json (eller via Konti sitt deployment-system):

{
  "msalClientId": "<application-client-id>",
  "msalTenantId": "<tenant-id>",
  "msalScopes": ["openid", "profile", "email", "User.Read"]
}

Sett enten msalTenantId eller msalAuthority — ikke begge. msalTenantId har forrang.

4. Test login

Klikk Logg inn med Microsoft på login-skjermen. Du skal omdirigeres til Microsoft, autorisere, og lande på /home.


Slik gjør du — backend Graph (SharePoint, Planner, e-post)

For at app-only-tjenester (SharePoint-browse, Planner-sync, Graph e-post) skal fungere må backend-credentials være registrert.

1. Opprett (eller bruk eksisterende) app-registrering for backend

I Entra ID Admin → App registrations:

  • Hvis du allerede har en SPA-registrering for innlogging: legg til Web-platform med "Confidential client" og en client-secret
  • Eller opprett en separat "ePortal Backend"-app for å skille SPA og backend-credentials
  • Generer en Client Secret under "Certificates & secrets" — den vises kun én gang

2. Tildel application-permissions

Som beskrevet under "Påkrevde Graph API-permissions" — vurder hvilke moduler kunden trenger og tildel kun det. Klikk "Grant admin consent".

3. Lagre i ePortal Systemadministrasjon

I ePortal → Systemadministrasjon → Systeminnstillinger → Microsoft 365:

  • M365Graph.TenantId: Directory (tenant) ID
  • M365Graph.ClientId: Application (client) ID
  • M365Graph.ClientSecret: lim inn client-secret (krypteres ved lagring)
  • M365Graph.DefaultGroupId: Group ID for Planner (valgfritt)
  • M365Graph.Enabled: sett til true

4. Verifiser

  • For Planner og To Do: kjør integrasjonen manuelt fra Konti Connect — feil-loggen viser hvilken permission som mangler
  • For SharePoint: åpne et CRM-objekt og prøv "Koble til SharePoint-mappe"
  • For Graph e-post: utløs en KAI bug-rapport uten Freshdesk konfigurert — e-posten skal sendes via Graph

Slik gjør du — Outlook-addin

1. Bestill addin-manifest fra Konti

Konti har en Office Add-in-manifestfil. Send forespørsel via Konti support eller e-post til support@konti.no med tenant-navn og hvilke Outlook-versjoner addin skal støtte.

2. Last opp i Microsoft Admin

  • Microsoft 365 Admin Center → Apps → Integrated apps → Upload custom apps
  • Last opp manifest-filen
  • Tildel til relevante brukergrupper

3. Brukere installerer

Hver bruker:

  • Åpner Outlook → New email → vise apps
  • ePortal-addin vises
  • Logger inn første gang med ePortal-konto (eller Entra SSO hvis konfigurert)

4. Bruk

I Outlook:

  • Marker en e-post → klikk ePortal-addin
  • Velg kunde / kontakt / avtale i CRM
  • E-posten lagres som aktivitet — se Loggføre kommunikasjon

Slik gjør du — SharePoint

1. Registrer ePortal-app i Entra ID med SharePoint-scope

  • Permissions: Sites.Read.All (eller Sites.ReadWrite.All hvis ePortal skal skrive)
  • Files.Read.All

2. Konfigurer i Konti Connect

  • Konti Connect → SharePoint → Ny tilkobling
  • Lim inn Client ID
  • Angi SharePoint-tenant URL (typisk <tenant>.sharepoint.com)

3. Konfigurer dokument-bibliotek-tilgang

For hver tenant: hvilke SharePoint-områder skal være synlige i ePortal? Konfigurer per prosjekt eller per-rolle.

4. Brukere autoriserer (On-Behalf-Of-flow)

Første gang en bruker åpner SharePoint-dokumenter fra ePortal:

  • Popup spør om tilgang via OBO-flow
  • Bruker logger inn med M365-konto
  • Tilgang gis basert på SharePoint-rettigheter

Slik gjør du — Teams

1. Aktiver Teams-integrasjonen

  • Konti Connect → Teams → Ny tilkobling
  • Tilkoble Entra ID app som registrert tidligere
  • Tilleggs-permissions: Chat.Read.All, OnlineMeetings.Read.All

2. Konfigurer møte-integrasjon

For prosjekt-/CRM-møter:

  • Møte-lenker genereres automatisk når avtale opprettes i ePortal
  • Bruker velger "Opprett Teams-møte" i avtale-detaljen

3. Konfigurer kanal-varslinger (valgfri)

  • Per modul (HMS-avvik, fakturasend, osv.) — varslinger til valgt Teams-kanal
  • Konfigureres per tenant og per varslings-type

Sikkerhet

  • OAuth-tokens roteres typisk hver 60-90 dager
  • Bruk dedikerte service-kontoer for SharePoint/Teams-tilkobling
  • OBO-flow (On-Behalf-Of) brukes for per-bruker SharePoint-tilgang — refresh-token gjelder per bruker
  • GDPR: e-post-data lagret i ePortal via Outlook addin må behandles iht databehandleravtale
  • Aldri del Client Secret eller addin-manifest med tredjepart

Vanlige problemer

Entra ID-pålogging gir 401

Sjekk:

  • msalClientId og msalTenantId matcher Entra ID-registreringen
  • Redirect URI er nøyaktig samme som registrert (case-sensitive)
  • App registration har riktige permissions tildelt og admin har bekreftet samtykke

Outlook addin vises ikke

  • Sjekk at addin er distribuert til brukerens gruppe
  • Brukeren må logge ut/inn av Outlook etter første distribusjon
  • Sjekk addin-manifest for korrekt versjon

SharePoint-dokumenter laster ikke

  • OBO-flow krevde brukerautorisering — kanskje den ble nektet første gang
  • Sjekk Konti Connect-logg for konkret feilmelding
  • Sjekk brukerens SharePoint-rettigheter

Teams-møte-lenker virker ikke

  • Tokens er utløpt — re-autoriser
  • Kontoer som genererte lenken har ikke lenger tilgang — bytt service-konto

"Token expired" mid-bruk

Tokens kan utløpe hvor som helst. ePortal har auto-refresh, men hvis refresh-token er for gammelt: bruker må logge inn på nytt eller administrator må reautorisere.


Relaterte sider