首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADAL 3令牌持久性

ADAL 3令牌持久性
EN

Stack Overflow用户
提问于 2017-11-04 03:07:15
回答 1查看 416关注 0票数 0

我在网上读了很多帖子后迷失了方向,需要一些建议。我在我的Xamarin.Forms项目中使用ADAL 3.17.1。现在,使用ADAL3时,刷新令牌和AcquireTokenByRefreshTokenAsync不再可用,并由内部处理。但是这个刷新令牌只存储在内存中,当IOS应用程序在后台运行时,或者当应用程序关闭并重新打开时,用户需要再次登录。

是否可以让用户在早上登录一次,并将令牌保留8-10小时?并且在接下来的8-10小时内应用程序启动或恢复时不要求登录?我在那上面找不到帖子。所有帖子都使用刷新令牌...

下面是在IOS中运行的Authenticator类中的代码:

代码语言:javascript
复制
    public class Authenticator_iOS : IAuthenticator
    {
        public async Task<MultipleAuthResult> Authenticate(string authority, string resource, string resource2, string clientId, string returnUri)
        {
            MultipleAuthResult multipleAuth = new MultipleAuthResult();

            var authContext = new AuthenticationContext(authority, new CustomTokenCache());
            if (authContext.TokenCache.ReadItems().Any())
                authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);

            var controller = UIApplication.SharedApplication.KeyWindow.RootViewController;
            var uri = new Uri(returnUri);
            var platformParams = new PlatformParameters(controller);
            platformParams.PromptBehavior = PromptBehavior.Auto;
            

            try
            {
                multipleAuth.ResultBackEnd = await authContext.AcquireTokenAsync(resource, clientId, uri, platformParams);      // Token for backend
                multipleAuth.ResultGraph = await authContext.AcquireTokenAsync(resource2, clientId, uri, platformParams);       // Token for Graph query
            }
            catch (Exception e)
            {
                return null;
            }

            return multipleAuth;
        }

        public void SingOut(string authority)
        {
            //Token
            var authContext = new AuthenticationContext(authority);
            if (authContext.TokenCache.ReadItems().Any())
            {
                authContext.TokenCache.Clear();
            }


            //Webview cookie
            NSHttpCookieStorage CookieStorage = NSHttpCookieStorage.SharedStorage;
            foreach (var cookie in CookieStorage.Cookies)
            {
                    CookieStorage.DeleteCookie(cookie);
            }

        }
    }

EN

回答 1

Stack Overflow用户

发布于 2018-01-27 03:58:44

看起来你每次触发你的方法时都会初始化一个新的缓存实例。

代码语言:javascript
复制
var authContext = new AuthenticationContext(authority, new CustomTokenCache());

这使得这个检查变得没有意义:

代码语言:javascript
复制
if (authContext.TokenCache.ReadItems().Any())

只需完全删除初始化CustomTokenCache,我有一种感觉,它将在默认情况下保留。改为执行以下操作:

代码语言:javascript
复制
var authContext = new AuthenticationContext(commonAuthority);

if (authContext.TokenCache.ReadItems().Count() > 0)
{
    authContext = new AuthenticationContext(
        authContext.TokenCache.ReadItems().First().Authority);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47102890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档