在长期存在的实体框架上下文中刷新Sql Connection Azure AD访问令牌

本文关键字:Connection Sql Azure AD 访问令牌 刷新 长期存在 实体 框架 上下文 | 更新日期: 2023-09-27 18:06:48

我正在尝试设置一些。net应用程序使用基于证书的身份验证到Azure Active Directory,然后使用Active Directory授权我访问Sql Azure DB。

我遇到的问题是,应用程序的某些部分使用的DbContext可能存在的时间有点长。如果您在访问令牌到期后5分钟内请求它,ADAL库将尝试刷新它。问题是,我的一些DbContexts可能会存活超过5分钟。因此,在DbContext的生命周期过半时,访问令牌不再好,当我尝试SaveChanges时,我得到一个数据库连接异常。

除了重构使我的DbContexts存活时间短于5分钟之外,我能做些什么来解决这个问题吗?

我尝试的一件事是在实体框架中找到一些钩子,在那里我可以捕获过期的访问令牌异常,然后用新创建的具有新访问令牌的连接替换当前连接。我尝试通过EF自定义连接工厂,然后使用执行策略重试,当我得到一个过期的令牌异常。但这对我来说不起作用,因为我无法从自定义执行策略修改或重新创建当前连接。

如有任何意见,不胜感激。

谢谢!

在长期存在的实体框架上下文中刷新Sql Connection Azure AD访问令牌

如果你负担得起的话,重构你的代码当然是最好的选择。

如果不能,您可以设置一个计时器,每4分钟触发一次,并在这个计时器中对DBContext执行一些简单的查询(如果需要,这会刷新您的身份验证令牌,确保在SaveChanges时它仍然有效)。在此期间,您还需要使用一些锁来保护DBContext,以避免同时使用DBContext进行简单查询和SaveChanges。