2016-09-14 39 views
9

Próbuję skonfigurować kilka aplikacji .NET, aby używać uwierzytelniania opartego na certyfikatach w usłudze Azure Active Directory, a następnie używać usługi Active Directory do autoryzowania dostępu do usługi. Sql Azure DB.Odświeżanie połączenia Sql Token dostępu do usług Azure AD w kontekście długotrwałego kontekstu encji

Problem, który napotykam, polega na tym, że niektóre części aplikacji używają kontekstu DbContext, który może trwać zbyt długo. Biblioteka ADAL próbuje odświeżyć token dostępu, jeśli zażądasz go w ciągu 5 minut od jego wygaśnięcia. Problem polega na tym, że niektóre z moich DbContextów mogą żyć dłużej niż 5 minut. W związku z tym, w połowie istnienia DbContext token dostępu nie jest już dobry i kiedy próbuję SaveChanges, otrzymuję wyjątek połączenia z bazą danych.

Oprócz refaktoryzacji, aby moje DbContexts żyły krócej niż 5 minut, czy jest coś, co mogę zrobić, żeby to naprawić?

Jedną z rzeczy, którą próbowałem, było znalezienie haków w Entity Framework, gdzie mogłem wychwycić wyjątek tokenu z wygasłem dostępu, a następnie zastąpić bieżące połączenie nowo utworzonym, który ma nowy token dostępu. Próbowałem przekazać EF do fabryki połączeń niestandardowych, a następnie użyć strategii wykonania, aby spróbować ponownie, gdy otrzymam wyjątek znacznika wygasłego. Nie działa to dla mnie, ponieważ nie mogę zmodyfikować ani odtworzyć bieżącego połączenia z niestandardowej strategii wykonywania.

Wszelkie pomysły będą mile widziane.

Dzięki!

+0

To brzmi jak zły pomysł. Kontekst jest przeznaczony do życia dla jednostki pracy, 5 minut brzmi, jakbyś wykonywał wiele jednostek pracy w tym samym kontekście. Spowoduje to inne problemy, takie jak wysoki poziom pamięci i słaba wydajność, jeśli robisz zbyt wiele rzeczy w kontekście. Moją rekomendacją byłoby refaktoryzacja kodu (niezależnie od tego konkretnego problemu). –

+0

Czy potrafisz sprecyzować, której wersji EF używasz, a także czy używasz struktury tożsamości? – GaelSa

+0

W jaki sposób przekazujesz token dostępu do DbContext? Nawet jeśli DbContext żyje długo, podstawowa DbConnection nie żyje długo, jest otwierana i zamykana dla każdego zapytania sql. –

Odpowiedz

2

Refaktoryzacja kodu jest z pewnością najlepszą opcją, jeśli możesz sobie na to pozwolić. Jeśli nie możesz, możesz ustawić timer na uruchamianie co 4 minuty, a w tym czasomierzu wykonaj proste zapytanie z DBContext (w razie potrzeby odświeżysz token uwierzytelniania, upewniając się, że jest on nadal ważny, gdy SaveChanges). Będziesz także musiał zabezpieczyć DBContext z pewną blokadą podczas tego, aby uniknąć prostego zapytania i SaveChanges używając DBContext w tym samym czasie.