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_SystemConfigurationunder kategoriMicrosoft365. 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_credentialsmot/oauth2/v2.0/token, scopehttps://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) IDM365Graph.ClientId: Application (client) IDM365Graph.ClientSecret: lim inn client-secret (krypteres ved lagring)M365Graph.DefaultGroupId: Group ID for Planner (valgfritt)M365Graph.Enabled: sett tiltrue
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(ellerSites.ReadWrite.Allhvis 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:
msalClientIdogmsalTenantIdmatcher 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¶
- Konti Connect-modulen
- Integrasjoner — oversikt
- CRM — Loggføre kommunikasjon — bruker Outlook addin
- Prosjekt-modulen — SharePoint dokument-tilknytning
- For utviklere — Connect API — alternativ for tredjeparts-integrasjon