在xamarin.form应用程序中存储令牌的位置

时间:2017-09-01 16:09:03

标签: xamarin.forms

我有下面的类,将在xamarin.forms移动应用程序中使用 检索OAuth(webapi)生成的令牌。一旦生成,我需要存储 在一个我可以再次访问它而不是一直生成它的地方。 在Pcl中存放这个的最佳位置在哪里?我也希望能够删除一次 用户注销。

        class LoginService
        {
            public async Task Login(string username, string password)
            {
                HttpWebRequest request = new HttpWebRequest(new Uri(String.Format("{0}Token", Constants.BaseAddress)));
                request.Method = "POST";

                string postString = String.Format("username={0}&password={1}&grant_type=password", 
                HttpUtility.HtmlEncode(username), HttpUtility.HtmlEncode(password));
                byte[] bytes = Encoding.UTF8.GetBytes(postString);
                using (Stream requestStream = await request.GetRequestStreamAsync())
                {
                    requestStream.Write(bytes, 0, bytes.Length);
                }

                try
                {
                    HttpWebResponse httpResponse =  (HttpWebResponse)(await request.GetResponseAsync());
                    string json;
                    using (Stream responseStream = httpResponse.GetResponseStream())
                    {
                        json = new StreamReader(responseStream).ReadToEnd();
                    }
                    TokenResponseModel tokenResponse = JsonConvert.DeserializeObject(json);
                    return tokenResponse.AccessToken;
                }
                catch (Exception ex)
                {
                    throw new SecurityException("Bad credentials", ex);
                }
            }
        }

3 个答案:

答案 0 :(得分:17)

令牌是敏感信息,我建议以安全的方式存储它们。安全存储可通过iOS中的Keychain服务和Android中的KeyStore类获得。 Xamarin对如何使用Xamarin.Auth进行了很好的article

其他可用选项包括:

    Akavache
  1. BlobCache.Secure
  2. SecureStorage
  3. XLabs
  4. 中的安全存储空间

答案 1 :(得分:6)

这是对任何人进行搜索的更新,因为自从创建此帖子以来情况已经发生了变化。不建议再使用以下内容:

Application.Current.Properties

要安全地存储访问令牌等内容,可以使用 Xamarin.Essentials SecureStorage 静态类。

如果您还没有添加 Xamarin.Essentials nuget软件包,则可以使用它,如下所示:

using Xamarin.Essentials;
.
.
.

await SecureStorage.SetAsync("someKey", "someValue");

var myValue = await SecureStorage.GetAsync("someKey");

您还可以选择

SecureStorage.Remove("someKey");
//or 
SecureStorage.RemoveAll();

答案 2 :(得分:1)

Forms有一个内置的Properties字典,您可以在其中存储少量持久数据。

Application.Current.Properties ["token"] = myToken;