Azure AD Login 1 Stunde Website

Nachdem ich unsere interne auf ASP.NET Webforms basierende Anwendung von Membership auf Azure AD (Open Connect) Login umgestellt habe, müssen sich die Benutzer dauernd neu einloggen.

Soweit meine These, das Cookie hängt an der Session.

Im ersten Schritt habe ich den Fehler im Login Code gesucht und vermeintlich gefunden. Das Property Ispersistent verspricht einen erfolgreiche Anmeldung über die Browser Session hinaus. In Kombination mit einer 12 Stunden Lebensdauer sollte das reichen.

   1:     If (Request.IsAuthenticated = False) Then
   2:              Request.GetOwinContext().Authentication.Challenge(
   3:                      New AuthenticationProperties With {.RedirectUri = "default.aspx",
   4:                      .IsPersistent = True, .AllowRefresh = True,
   5:                      .ExpiresUtc = DateTimeOffset.UtcNow.AddHours(12)},
   6:  OpenIdConnectAuthenticationDefaults.AuthenticationType)

Tut es aber nicht. Est zwar nun ein Cookie .AspNet.Cookies vorhanden, der offensichtlich den Token in Händen hält, aber die Expiration lautet auf idente Zeit GMT. Mit der Zeitverschiebung ergibt sich so ein Gültigkeit des Login Cookies von einer Stunde- zu wenig.

openid1

Offensichtlich hat ExpiresUTC keine Auswirkung auf das Cookie, sondern nur auf das Token. Die Cookie Authentifizierung wiederum wird beim Start der Web Anwendung konfiguriert in startup.Auth.vb. Microsoft setzt auf seine Owin Middleware. Neue Module werden in die HTTP Pipeline nicht in der web.config deklariert, sondern per Dependency Injection als Objekt erstellt.  In den Parametern findet sich auch die Lebensdauer des Cookies.

   1:   app.UseCookieAuthentication(New CookieAuthenticationOptions() With {
   2:   .ExpireTimeSpan = TimeSpan.FromDays(5),

Ist ihm leider auch völlig egal. Cookie bleibt bei einer Stunde.

Der nächste Einstiegspunkt ist der Zeitpunkt an dem die Cookie Authentifizierung im Owin Stack konfiguriert wird, wie immer in der Datei Startup.Auth.vb. Auch wenn man Expiretimespan setzt ergibt sich keine Änderung.  Man kann sich in das Event OnResponseSignedIn hängen. Dies wird ausgelöst nachdem die Anmeldung erfolgreich war. Dort kann man ebenso im Context das Property ExpiresUtc setzen- wieder einmal keine Änderung.

   1:    app.UseCookieAuthentication(New CookieAuthenticationOptions() With {
   2:   .ExpireTimeSpan = TimeSpan.FromDays(5),
   3:   .SlidingExpiration = False,
   4:   .CookieSecure = False,
   5:   .Provider = New CookieAuthenticationProvider With
   6:                  {
   7:                      .OnResponseSignedIn = Sub(context)
   8:                                                context.Properties.AllowRefresh = True
   9:                                                context.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddDays(1)
  10:                                            End Sub
  11:                  }
  12:                  })

Bleibt noch die Stelle an der die OpenID Connection für den Azure AD Login konfiguriert wird. Hier findet sich die Lösungs des Problems. Es muss UseTokenLifetime auf false gesetzt werden um den Cookie Wert zu erhalten der im Login Logik C# Code gesetzt wird. Dies findet sich in Listing 1 und ergibt 12h.

   1:  app.UseOpenIdConnectAuthentication(New OpenIdConnectAuthenticationOptions With {
   2:      .ClientId = appId,
   3:      .Authority = "https://login.microsoftonline.com/common/v2.0",
   4:      .Scope = $"openid email profile offline_access {graphScopes}",
   5:      .RedirectUri = redirectUri,
   6:      .PostLogoutRedirectUri = redirectUri,
   7:      .UseTokenLifetime = False,
   8:       

Bleibt die Frage warum die Tokenlifetime 1h Stunde ist und wo man das ändern kann. Gelesen habe ich etwas von 2 Wochen. Weiters gibt es wohl einen Silent Login, der den Token aktualisiert, was z.B. bei der Kommunikation zu Services wie MSGraph von Nöten sein könnte.

Kommentare sind geschlossen