ADAL 3令牌持久性

时间:2017-11-03 19:07:15

标签: xamarin.forms adal

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

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

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



    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);
            }

        }
    }
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

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

class ProfileForm extends React.Component {

  constructor(props, context) {
    super(props, context);
  }

  render() {
    return (
      <div>
        <TextInput name={'firstname'} label={'First name: '} value={this.props.user.firstname} onChange={this.props.onChange}/>
        <TextInput name={'lastname'} label={'Last name: '} value={this.props.user.lastname} onChange={this.props.onChange}/>
        <TextInput name={'phone'} label={'Phone: '} value={this.props.user.phone} onChange={this.props.onChange}/>
        <div>
          As who you want to be presented on a map:
          <CheckBoxInput name={"type"} label={"Driver"} value={Constants.TYPE_DRIVER} checked={!!this.props.markers.driver} onChange={this.props.onCheckBoxChange}/>
          <CheckBoxInput name={"type"} label={"Passenger"} value={Constants.TYPE_PASSENGER} checked={!!this.props.markers.passenger} onChange={this.props.onCheckBoxChange}/>
        </div>
      </div>
    );
  }
}

这使得这个检查没有实际意义:

var authContext = new AuthenticationContext(authority, new CustomTokenCache());

完全删除初始化if (authContext.TokenCache.ReadItems().Any()) ,我觉得默认情况下它会持续存在。 这样做:

CustomTokenCache