刷新长期 Entity Framework 上下文中的 Sql 连接 Azure AD 访问令牌

11

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

我的问题是,应用程序的某些部分使用的DbContext可能存在时间过长的情况。如果您在5分钟内请求过期的令牌,ADAL库会尝试刷新访问令牌。问题是,我的某些DbContext可能比5分钟更长寿。因此,在DbContext寿命的一半时,访问令牌就不再有效了,当我尝试保存更改时,会出现数据库连接异常。

除了重构以使我的DbContext的生命期短于5分钟之外,我还能做些什么来解决这个问题吗?

我尝试过的一件事是在Entity Framework中找到一些钩子,可以捕获过期的访问令牌异常,然后将当前连接替换为一个具有新访问令牌的新创建连接。我尝试传递自定义连接工厂给EF,然后使用Execution Strategy在获取过期令牌异常时进行重试。但是,这对我没有起作用,因为我无法从自定义执行策略中修改或重新创建当前连接。

任何想法将不胜感激。

谢谢!


这听起来不是一个好主意。上下文旨在为一个工作单元而存在,5分钟听起来像您正在使用相同上下文进行大量的工作单元。如果您在上下文中执行太多操作,这将导致其他问题,例如高内存占用和性能差。我的建议是重构您的代码(无论此特定问题如何)。 - undefined
你能明确一下你正在使用的 EF 版本吗?此外,你是否正在使用 Identity 框架? - GaelSa
你是如何将访问令牌传递给DbContext的?即使DbContext存在很长时间,底层的DbConnection并不会一直存在,它会在每个SQL查询中打开和关闭。 - Akash Kava
1个回答

3

如果您有足够的财力,重构代码肯定是最好的选择。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接