我打算创建一个Xamarin(.Forms)应用程序,它必须具有身份验证:用户应提供用户名和密码来获取数据。
问题在于它也必须脱机工作(这意味着它不应依赖服务器进行身份验证过程)。
到目前为止,我考虑了以下内容:
最佳做法是什么?Xamarin是否有内置解决方案?
这取决于您的应用程序需求-如果您仅需要验证用户身份以离线访问某些受限数据-我建议您对用户名和密码进行哈希处理,并将其存储在本地设备中(无论在何处进行哈希处理) 。
如果以后需要使用用户名和密码来通过服务器进行身份验证,则应使用安全数据,例如钥匙串,Xamarin具有内置的使用抽象,即Xamarin.Auth,您可以在其中存储凭据安全地。
*注意-在越狱/有根的设备中存储敏感数据是有风险的,请谨慎使用。
编辑-我添加了有关如何使用和使用这些服务的工作代码示例:
1)在您的便携式项目中添加以下界面:
public interface ISecuredDataProvider
{
void Store(string userId, string providerName, IDictionary<string, string> data);
void Clear(string providerName);
Dictionary<string, string> Retreive(string providerName);
}
2)在您的Android项目中,添加以下实现:
public class AndroidSecuredDataProvider : ISecuredDataProvider
{
public void Store(string userId, string providerName, IDictionary<string, string> data)
{
Clear(providerName);
var accountStore = AccountStore.Create(Android.App.Application.Context);
var account = new Account(userId, data);
accountStore.Save(account, providerName);
}
public void Clear(string providerName)
{
var accountStore = AccountStore.Create(Android.App.Application.Context);
var accounts = accountStore.FindAccountsForService(providerName);
foreach (var account in accounts)
{
accountStore.Delete(account, providerName);
}
}
public Dictionary<string, string> Retreive(string providerName)
{
var accountStore = AccountStore.Create(Android.App.Application.Context);
var accounts = accountStore.FindAccountsForService(providerName).FirstOrDefault();
return (accounts != null) ? accounts.Properties : new Dictionary<string, string>();
}
}
3)在您的iOS项目中,添加以下实现:
public class IOSSecuredDataProvider : ISecuredDataProvider
{
public void Store(string userId, string providerName, IDictionary<string, string> data)
{
Clear(providerName);
var accountStore = AccountStore.Create();
var account = new Account(userId, data);
accountStore.Save(account, providerName);
}
public void Clear(string providerName)
{
var accountStore = AccountStore.Create();
var accounts = accountStore.FindAccountsForService(providerName);
foreach (var account in accounts)
{
accountStore.Delete(account, providerName);
}
}
public Dictionary<string, string> Retreive(string providerName)
{
var accountStore = AccountStore.Create();
var accounts = accountStore.FindAccountsForService(providerName).FirstOrDefault();
return (accounts != null) ? accounts.Properties : new Dictionary<string, string>();
}
}
4)用法示例-提取Facebook令牌后,我们将其存储为:
securedDataProvider.Store(user.Id, "FacebookAuth", new Dictionary<string, string> { { "FacebookToken", token } });
注意-我添加了两层数据,以便使第一层指示身份验证是否为Facebook / UserName-Password / other。第二层是数据本身-即Facebook令牌/凭据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句