为了账号安全,请及时绑定邮箱和手机立即绑定

SQL Server 令牌缓存问题

SQL Server 令牌缓存问题

C#
鸿蒙传说 2021-10-24 19:55:23
我基本上从这里获取代码https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-multitenant-openidconnect/blob/master/TodoListWebApp/DAL/EFADALTokenCache.cs但它不适合我应用程序,因为我不需要示例中给出的每个用户的缓存。因此,我删除了接受 User 作为参数的构造函数,因为我希望缓存是全局的。我想出了这个版本: public class EFTestTokenCache : TokenCache {        private TestEntities _TestEntities = new TestEntities();        private TestTokenCache _cache;        public EFTestTokenCache()        {            this.AfterAccess = AfterAccessNotification;            this.BeforeAccess = BeforeAccessNotification;            this.BeforeWrite = BeforeWriteNotification;        }        // clean up the DB        public override void Clear()        {            base.Clear();            foreach (var cacheEntry in _TestEntities.TestTokenCaches)                _TestEntities.TestTokenCaches.Remove(cacheEntry);            _TestEntities.SaveChanges();        }        // Notification raised before ADAL accesses the cache.        // This is your chance to update the in-memory copy from the DB, if the in-memory version is stale        void BeforeAccessNotification(TokenCacheNotificationArgs args)        {                        if (_cache == null)            {                // first time access                _cache = _TestEntities.TestTokenCaches.FirstOrDefault(c => c.webUserUniqueId == args.DisplayableId);            }            else            {   // retrieve last write from the DB                var status = from e in _TestEntities.TestTokenCaches                             where (e.webUserUniqueId == args.DisplayableId)                             select new                             {                                 LastWrite = e.LastWrite                             };您认为这作为全局缓存是否可以正常工作,还是有问题并且始终必须像示例中给出的那样基于用户?另一个查询是为什么数据库在Clear(). 这是否意味着每当应用程序池关闭或我的数据库将被清除?但这不应该发生。任何帮助表示赞赏。
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

如果您尝试实现全局令牌缓存而不考虑用户,那么我会看到您的代码存在问题,因为代码正在寻找每个登录用户的任何现有缓存,因为代码正在使用 webUserUniqueId 进行过滤

_TestEntities.TestTokenCaches.FirstOrDefault(c => c.webUserUniqueId == args.DisplayableId);

在正确的示例代码中,每个用户都有一组保存在数据库中(或作为集合)的令牌,因此当他们登录到 Web 应用程序时,他们可以直接执行 Web API 调用,而无需重新进行身份验证/重复同意。

我不确定您为什么要这样做,但在我看来,如果您要为 Web 实现自定义令牌缓存,最好为不同的登录用户提供所需的令牌之间的隔离级别。

此外,Clear() 方法通过删除 db 中的所有项目来清除缓存,但在 GitHub 示例中尚未调用此方法,您需要从 AccountController 的 SignOut() 方法中添加对 authContext.TokenCache.clear() 的调用以在用户注销时清除缓存。


查看完整回答
反对 回复 2021-10-24
  • 1 回答
  • 0 关注
  • 210 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信