PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据。

那么什么是凭据保险箱呢?简单的说就是开发者可以在用户输入完凭证(一般是用户名和密码),凭证有效的情况下将该凭证存储在叫做"凭据保险箱"里,该凭据保险箱里的用户凭据将会自动漫游到用户设备的Windows账户中并随时能够再次被App获取。

例如:有一个UWP的App运行在PC上,某用户在使用该App时登录了自己的账户并允许将账户凭据保存在"凭据保险箱"中,那么当该用户再使用平板电脑、手机或者其他同一个Windows账户的Windows设备时第一次打开该App,我们就可以从Windows账户中将该用户的数据漫游到新设备进行用户登录的操作。

说的简单点就是用户的账户和密码会被漫游到Windows账户中,日后及时是跨设备使用该App,只要设备Windows账户没变,就可以实现在新设备上快捷登陆的功能。

要想使用"凭据保险箱",我们需要了解以下几个类:

– Windows.Security.Credentials.PasswordVault 表示凭据的"凭据保险箱"

保险箱的内容特定于应用程序或服务。应用程序和服务无法访问与其他应用程序或服务关联的凭据。

– PasswordVault.Add(PasswordCredential credential); 添加一个凭证保险箱

– PasswordVault.Remove(PasswordCredential credential); 移除一个凭证保险箱

– PasswordVault.Retrieve(System.String resource, System.String userName); 读取一个凭证保险箱

– PasswordVault.FindAllByResource(System.String resource); 搜索与指定资源相匹配的凭据保险箱

– Windows.Security.Credentials.PasswordCredential 表示凭据对象

– PasswordCredential.PasswordCredential(System.String resource, System.String userName, System.String password); 创建一个凭据对象

– PasswordCredential.UserName 凭据对象存储的UserName

– PasswordCredential.Resource 凭据对象所属的资源名

– PasswordCredential.Password 凭据对象存储的密码

 

我们通过例子来看一下"凭据保险箱"是如何工作的(注:本文不考虑实现 记住密码 自动登陆 功能

首先创建一个UWP通用项目,

然后新建一个LoginPage页面,并将起始页改为LoginPage页面

在LoginPage上布局出一个登陆框如下:

xaml代码:

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel Margin="0,0,0,128" HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal">
<TextBlock Text="账 户:"/>
<TextBox Text="{x:Bind UserName,Mode=TwoWay}" PlaceholderText="请输入您的账户" Width="240"/>
</StackPanel>
<StackPanel Margin="0,4" Orientation="Horizontal">
<TextBlock Text="密 码:"/>
<PasswordBox PlaceholderText="请输入您的密码" Password="{x:Bind Psw,Mode=TwoWay}" Width="240"/>
</StackPanel> <CheckBox IsChecked="{x:Bind RoamCredential,Mode=TwoWay}" Content="漫游我的登录凭证" HorizontalAlignment="Right" ToolTipService.ToolTip="勾选漫游凭证后,您的登录信息将被漫游到本机WindowsLive账户" /> <Grid Margin="0,12,0,0" >
<Button Click="{x:Bind QuickLogin}" Content="WindowsLive快捷登陆"/>
<Button Click="{x:Bind Login}" Content="登 录" HorizontalAlignment="Right"/>
</Grid>
</StackPanel>
</Grid>

后台代码中,我们先实现"登录按钮"的Click方法:

         private async void Login(object sender, RoutedEventArgs args)
{
// 假设做用户账户和密码的验证工作(这里不考虑登录是否成功 一律登录成功)
await ShowLoding();
if (RoamCredential != true) return;
//添加用户凭证到 PasswordVault
var vault = new PasswordVault();
vault.Add(new PasswordCredential(
_resourceName, UserName, Psw));
} /// <summary>
/// 显示登陆中Tip 并跳转到MainPage
/// </summary>
/// <returns>Null</returns>
private async Task ShowLoding()
{
var dialog = new ContentDialog
{
Title = "提示",
Content = "正在登录",
IsPrimaryButtonEnabled = true
};
#pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
dialog.ShowAsync();
#pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法 await Task.Delay();
dialog.Content = "登录成功";
await Task.Delay();
dialog.Hide();
Frame.Navigate(typeof(MainPage), _userName);
}

假设用户的用户名和密码验证通过情况下,如果用户允许保存凭据到 "凭据保险箱",我们就可以使用PasswordVault对象的Add方法添加到"凭据保险箱"里一个PasswordCredential 凭据对象,然后跳转到MainPage,并传递用户名。

当用户点击使用"Windows账户快捷登陆"按钮时,我们首先去检测在该App的ResourceName下,一共有几个用户凭据,如果有多个则需要让用户选择一个账户进行登陆,代码如下:

 private async void QuickLogin(object sender, RoutedEventArgs args)
{
var credential = await GetCredentialFromLocker();
if (credential == null) return;
UserName = credential.UserName;
Psw = credential.Password;
await ShowLoding();
}
/// <summary>
/// 获取密码凭证
/// </summary>
/// <returns>PasswordCredential</returns>
private async Task<PasswordCredential> GetCredentialFromLocker()
{
PasswordCredential credential = null; var vault = new PasswordVault();
var credentialList = vault.FindAllByResource(_resourceName);
if (credentialList.Count > )
{
if (credentialList.Count == )
{
credential = credentialList[];
}
else
{
_defaultUserName = await GetDefaultUserNameUI(credentialList.Select(s => s.UserName));
if (!string.IsNullOrEmpty(_defaultUserName))
{
//读取凭证
credential = vault.Retrieve(_resourceName, _defaultUserName);
}
}
} return credential;
} /// <summary>
/// 获取一个用户名,如果存在多个用户凭证则选择一个
/// </summary>
/// <param name="userList">用户名集合</param>
/// <returns>UserName</returns>
private async Task<string> GetDefaultUserNameUI(IEnumerable<string> userList)
{
var userName = string.Empty;
var dialog = new ContentDialog
{
Title = "账户选择",
IsPrimaryButtonEnabled = true,
IsSecondaryButtonEnabled = true,
BorderThickness = new Thickness(, , , ),
PrimaryButtonText = "确定",
SecondaryButtonText = "取消"
};
var sp = new StackPanel();
var tb = new TextBlock { Text = "请选择您要登录哪个账户:" };
var cm = new ComboBox();
foreach (var user in userList)
{
// ReSharper disable once PossibleNullReferenceException
cm.Items.Add(new TextBlock
{
Text = user
});
}
cm.SelectedIndex = ;
sp.Children.Add(tb);
sp.Children.Add(cm);
dialog.Content = sp;
dialog.PrimaryButtonClick += (s, a) =>
{
// ReSharper disable once PossibleNullReferenceException
userName = (cm.SelectedItem as TextBlock).Text;
};
dialog.SecondaryButtonClick += (s, a) => { dialog.Hide(); };
await dialog.ShowAsync();
return userName;
}

至此我们的App就支持了使用“凭据保险箱”功能,只要Windows账户一致,不论在什么windows设备上我们都可以做快捷登陆,下面是效果(本机demo的Win账户是公司的账户,和自己的手机上账户不一致,没法演示跨设备,不过我们可以使用删除App重新安装的方式来查看凭据是否被漫游了,答案是肯定的)

推荐一个UWP开发群:53078485 大家可以进来一起学习

Win10/UWP开发—凭据保险箱PasswordVault的更多相关文章

  1. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  2. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

  3. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

  4. Win10 UWP开发实现Bing翻译

    微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...

  5. Win10/UWP开发—使用Cortana语音指令与App的前台交互

    Win10开发中最具有系统特色的功能点绝对少不了集成Cortana语音指令,其实Cortana语音指令在以前的wp8/8.1时就已经存在了,发展到了Win10,Cortana最明显的进步就是开始支持调 ...

  6. Win10 UWP 开发系列:使用SQLite

    在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中 ...

  7. Win10/UWP开发-Ink墨迹书写

    在UWP开发中,微软提供了一个新型的InkCanvas控件用来让用户能书写墨迹,在新版的Edga浏览器中微软自己也用到了该控件使用户很方便的可以在web上做笔记. InkCanvas控件使用很简单,从 ...

  8. Win10 UWP 开发系列:使用多语言工具包让应用支持多语言

    之前我在一篇blog中写过如何使用多语言工具包,见http://www.cnblogs.com/yanxiaodi/p/3800767.html 在WinEcos社区也发布过一篇详细的文章介绍多语言工 ...

  9. Win10/UWP开发—SystemNavigationManager

    Win10系统为确保所有应用中的一致导航体验,提供后退导航功能.当你的应用在手机.平板电脑上或者在支持系统后退功能的电脑或笔记本电脑上运行时,系统会在"后退"按钮被按下时通知你的应 ...

随机推荐

  1. javascript无线端的判断

    经常在工作中要求网页做这样的处理判断:针对无线端的网页,我们需要兼容一种异于PC端的网页效果. 如下代码就可以实现无线端的判断: var mobs = ['android', 'ipad', 'ipo ...

  2. Python函数式编程学习笔记

    High order function map(f,Iterable),将f依次作用在Iterable的每个元素然后返回一个Iterator,再用list(map(f,Iterable))进行转换得到 ...

  3. 【思路】-分页-双top分页算法的原理

    描述:实现分页的一种算法 大致过程:访客访问不同的分页,为这个当前页生成动态的查询SQL,然后送到数据库中执行 输入:总条数,每页多少条,第几页,查询的SQL,排序的字段 注意:传入的排序字段需要构成 ...

  4. MySQL 性能优化 30个数据库设计的最佳实践

    数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...

  5. mac 安装mvn 失败

    安装过程遇到2个问题 1.java版本不对 2.Error: JAVA_HOME is not defined correctly. We cannot execute $/usr/libexec/j ...

  6. 繁星——jquery的data()方法

    今天在看JQuery文档的时候偶然看到了data()方法,觉得挺好用的,这里做个记录. 这个方法用于在元素上存放数据,返回jQuery对象.在文档中提到V1.4.3 新增用法NEW data(obj) ...

  7. MySQL数据库的一些基本操作及注释

    --Created by mac on 2017/1/4. -- MySQL数据库 -- ****************** 一. 连接数据库服务器的基础命令 ******************* ...

  8. error MSB6006: “CL.exe”已退出,代码为X —— 的解决办法

    错误 : error MSB6006: “CL.exe”已退出,代码为X . 解决方法: 1.有少可能是执行目录引起的. 参考 http://bbs.csdn.net/topics/370064083 ...

  9. keep the bar green to keep the code clean——Junit详解(二)

    测试用例&测试套件 举个栗子: 编写MyStack类模拟栈,并对其进行测试用例编写测试: 编写文件删除方法,并对其删除测试. 不再做演示,戳此获取代码 MyStack类: public cla ...

  10. [vijos P1040] 高精度乘法

    如果这次noip没考好,完全是因为从7月29日之后就没有再写过程序了.说起来,真是一个泪流满面的事实… 那这样一个弱智题练手恢复代码能力,竟然还花了我两个晚上(当然不是两整个晚上…) 第一天TLE了, ...