gpt4 book ai didi

c# - 当我只需要为每个缓存存储一个 token 时实现 TokenCache

转载 作者:行者123 更新时间:2023-11-30 21:34:33 34 4
gpt4 key购买 nike

我有一个应用程序,旨在从多个租户读取租户数据,这需要管理员同意。因此,我只需为每个租户存储来自 AquireTokenByAuthorizationCodeAsync() 的一个访问 token 和一个刷新 token 。所以我想知道,如果我要在这种情况下实现TokenCache扩展,是否有必要实现TokenCache.AfterAccessTokenCache.BeforeAccess?另外,当使用 AquireTokenAsync() 时,缓存位是否会被获取的新 token 覆盖,或者只是附加到它上面?如果我想覆盖旧的 token ,我可以简单地使用 TokenCache.BeforeWrite 来清除旧的缓存吗?

基本上,这就是我的想法:

public class ADALTokenCache : TokenCache
{
public Guid TenantId;

public ADALTokenCache(Guid tenantId) : base()
{
TenantId = tenantId;
using (var dbContext = new MyDbContext())
{
byte[] cache = dbContext.TokenCacheSet.FirstOrDefault(c => c.TenantId == TenantId);
if (cache != null)
{
Deserialize(MachineKey.Unprotect(cache, "ADALCache"));
}
}
}


void BeforeWriteNotification(TokenCacheNotificationArgs args)
{
//Could I call Clear() here so that only
//the new token from AquireTokenAsync() is written?
}
}

最佳答案

回答您的问题

  • 示例中的缓存之所以保持原样,是因为多个用户可能会登录到该应用程序。顺便说一句,即使这是不同租户中的同一用户(身份可能不同),情况也会如此。您在 Custom token cache serialization in Web applications / Web API 中有实现示例
  • 事实上,当 AcquireTokenSilentAsync 刷新 token 时,它将覆盖缓存中的先前 token 。

但是,退一步

  • 如果我理解正确的话,在您的场景中,您的应用程序并不是获取 token 来访问给定用户的数据,而是访问租户数据(针对用户所属的租户?),然后定期访问进行一些操作。

  • 如果您有一个守护程序应用程序(但 Multi-Tenancy ),这不是更常见的情况吗?因此您可能想使用 client credentials flow而不是authorization code flow 。由于您使用的是 ADAL(V1 端点),您可以在 Azure 门户中预先同意该应用程序吗?您不需要登录任何用户吗?客户端凭据流页面包含指向守护程序应用程序的 ADAL 示例的链接。

  • 您可能还想查看active-directory-dotnet-daemon-v2这似乎非常接近您的场景(但对于 Azure AD V2 端点)。不过,它可以轻松转置到 Azure AD V1 端点,或者您仍然可以按原样使用示例,但将接受的权限限制为一组租户。

关于c# - 当我只需要为每个缓存存储一个 token 时实现 TokenCache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051048/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com