Aktualisieren des Azure AD-Zugriffstokens für die SQL-Verbindung im Kontext des langlebigen Entitätsrahmens

9

Ich versuche, einige .NET-Anwendungen einzurichten, um die zertifikatbasierte Authentifizierung für Azure Active Directory zu verwenden, und verwende dann Active Directory, um meinen Zugriff auf eine SQL Azure DB zu autorisieren.

Das Problem, auf das ich stoße, ist, dass einige Teile der Anwendung einen DbContext verwenden, der vielleicht ein bisschen zu lange lebe. Die ADAL-Bibliothek versucht, das Zugriffstoken zu aktualisieren, wenn Sie es innerhalb von 5 Minuten nach Ablauf anfordern. Das Problem ist, dass einige meiner DbContexte länger als 5 Minuten leben können. Also, in der Mitte der Lebensdauer des DbContext ist das Zugriffstoken nicht mehr gut und wenn ich versuche, SaveChanges zu versuchen, bekomme ich eine Datenbankverbindungsausnahme.

Abgesehen von Refactoring, um meine DbContexte kürzer als 5 Minuten zu leben, kann ich irgendetwas tun, um das zu beheben?

Eine Sache, die ich ausprobiert habe, war, in Entity Framework einige Hooks zu finden, wo ich die abgelaufene Zugriffstoken-Ausnahme abfangen und dann die aktuelle Verbindung durch eine neu erstellte mit einem neuen Zugriffstoken ersetzen konnte. Ich habe versucht, EF eine benutzerdefinierte Verbindungsfactory übergeben und dann eine Ausführungsstrategie verwenden, um es erneut zu versuchen, wenn ich eine abgelaufene Token-Ausnahme erhalte. Dies funktioniert jedoch nicht für mich, da ich die aktuelle Verbindung nicht von einer benutzerdefinierten Ausführungsstrategie aus ändern oder neu erstellen kann.

Irgendwelche Ideen würden sehr geschätzt werden.

Danke!

    
Nick 14.09.2016, 00:19
quelle

1 Antwort

2

Refactoring Ihres Codes ist sicherlich die beste Option, wenn Sie es sich leisten können.

Wenn das nicht möglich ist, können Sie einen Timer für alle 4 Minuten festlegen und in diesem Timer eine einfache Abfrage mit dem DBContext durchführen (dadurch wird Ihr Authentifizierungstoken bei Bedarf aktualisiert, um sicherzustellen, dass es auch bei SaveChanges gültig ist) . Sie müssen außerdem den DBContext mit einer Sperre schützen, um die einfache Abfrage und SaveChanges mit dem DBContext gleichzeitig zu vermeiden.

    
Philippe 27.09.2016 05:41
quelle