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

标签 c# azure azure-active-directory adal

我有一个应用程序,旨在从多个租户读取租户数据,这需要管理员同意。因此,我只需为每个租户存储来自 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/

相关文章:

c# - System.Threading.Thread 在 .NET Core 中的含义与在 .NET Framework 中的含义相同吗?

c# - 文本框 - 绑定(bind)的属性值不会立即更新

Azure Lighthouse - 获取订阅级别部署的区域

azure - 使用 Next-Auth 身份验证从 Azure Active Directory 获取配置文件图像

azure - Azure AD session token 的位置

c# - ConfigurationManager.AppSettings[Key] 是否每次都从 web.config 文件中读取?

c# - 从 .NET 中的 Authenticode 签名文件获取时间戳

azure - 使用 Azure AD B2C 时如何控制/设置单个用户的权限

azure - 如何将 IIS app_offline.htm 文件与 Azure 结合使用

azure - terraform变量类型错误: Attribute must be a whole number