Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用(后续)
在【Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用】里面提到了Microsoft 身份认证,其实这也是一大块需要注意的地方,特作为后续补充这些知识点。上章是使用了Microsoft Authentication Library (MSAL)类库做认证,其实最后使用的是Azure AD V2.0 的OAuth2.0认证,而且支持所有用户身份认证:
- 个人用户(@live.com、@outlook.com、@hotmail.com)
- 企业(工作或学校)用户(@xxx.onmicrosoft.com)
以前如果需要支持Microsoft个人账号和Azure Active Directory两者是很困难的,必须实现两套认证逻辑,现在借助Azure AD V2.0可以一次性实现。

Azure AD V2.0 和 Azure AD区别统计如下:
| Azure AD | Azure AD V2.0 | |
| 条件访问设备策略 | 支持 | 目前不支持 |
| 兼容 OAuth 2.0 和 OpenID Connect | 不兼容 | 兼容 |
| 用户权限 | 静态:应用注册期间已指定 | 动态:应用运行时期间请求;包括增量许可 |
| 帐户类型 |
工作或学校 |
工作或学校 个人 |
| 应用程序 ID | 各个平台单独的应用程序 ID | 多个平台同一个应用程序 ID |
| 注册地点 | Microsoft Azure 管理 | Microsoft 应用程序注册 |
| 认证类库 | ADAL:Active Directory 身份验证 例如: AuthenticationContext.AcquireTokenAsync(resource,CLIENT_ID,new Uri(REDIRECT_URL), platformParameters); |
MSAL:Microsoft身份验证(预览版) 例如: PublicClientApplication.AcquireTokenAsync(Scopes) |
温馨提醒:
在[Microsoft 应用程序注册]注册的应用ID,ADAL一样可以使用登录,不过只限管理员和已经授权给这个应用的用户.(如果用户登录不了,可以先使用MSAL类库弹出授权页面授权,然后再使用ADAL就可以登录了。)

Token
通过ADAL或者MSAL类库取得的JWT IDToken是可以解析的,解析之后的数据如下:

两个类库取得的RefreshToken都是存储在应用相关文件夹里面,具体地址如下:
UWP
{
try
{
var localSettings = ApplicationData.Current.LocalSettings; localSettings.CreateContainer(LocalSettingsContainerName, ApplicationDataCreateDisposition.Always); byte[] state = LocalSettingsHelper.GetCacheValue(localSettings.Containers[LocalSettingsContainerName].Values); if (state != null) { DefaultShared.Deserialize(state); } } catch (Exception ex) { Logger.Information(null, "Failed to load cache: " + ex); // Ignore as the cache seems to be corrupt
}
}
Android
try
{
ISharedPreferences preferences
= Application.Context.GetSharedPreferences(SharedPreferencesName, FileCreationMode.Private); string stateString = preferences.GetString(SharedPreferencesKey, null); if (stateString != null) { byte[] state = Convert.FromBase64String(stateString); args.TokenCache.Deserialize(state); } } catch (Exception ex) { PlatformPlugin.Logger.Warning(null, "Failed to load cache: " + ex); // Ignore as the cache seems to be corrupt
}
iOS
try
{
SecStatusCode res;
var rec = new SecRecord(SecKind.GenericPassword) { Generic = NSData.FromString(LocalSettingsContainerName), Accessible = SecAccessible.Always, Service = "MSAL.PCL.iOS Service", Account = "MSAL.PCL.iOS cache", Label = "MSAL.PCL.iOS Label", Comment = "MSAL.PCL.iOS Cache", Description = "Storage for cache"
};
var match = SecKeyChain.QueryAsRecord(rec, out res); if (res == SecStatusCode.Success && match != null && match.ValueData != null) { byte[] dataBytes = match.ValueData.ToArray(); if (dataBytes != null) { args.TokenCache.Deserialize(dataBytes); } } } catch (Exception ex) { PlatformPlugin.Logger.Warning(null, "Failed to load cache: " + ex); // Ignore as the cache seems to be corrupt
}
| Token | 有效期 | 描述 |
| ID Token(企业用户) | 1小时 | |
| ID Token(个人用户) | 24小时 | |
| Access Token | 1小时 | 可以通过Refresh Token获取新的。 |
| Refresh Token(企业用户) | 14天 | 每次使用之后重新设置14天有效期,最大更新到90天。 |
| Refresh Token(个人用户) | 1年 |
备注:
之所以对这个稍微研究,其实最开始是有一个目的【就是使用这些类库获得的Token是否可以访问所有企业的Office365?】。调查之后发现ADAL确实可以直接访问Sharepoint Rest API,不过每个企业的Azure AD都需要注册身份验证应用,从而有多个应用ID,这样程序请求的应用ID都需单独设置,这样就变成了企业定制版(如果有懂的希望能给点建议?毕竟Azure AD上还有很多现成的应用,这些不知道是怎么放上去的?)。对应MSAL类库得使用它自己开放出来的Sharepoint API才行,而且目前它的API还是Beta版很多东西都不完全。如果只想做企业内部的应用的话,ADAL类库还是足够的。
Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用(后续)的更多相关文章
- Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用
通过本文你将学会如下内容: 1,如何使用Xamarin开发跨平台(Windows,Android,iOS)应用. 2,如何使用微软的登录界面登入Microsoft账号. 3,如何使用Outlook邮箱 ...
- Xamarin+Prism开发详解一:PCL跨平台类库与Profile的关系
在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]中提到过以下错误,不知道大伙还记得不: 无法安装程序包"Microsoft.Identity.Client 1.0. ...
- Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
Xamarin.Forms 是一个跨平台的.基于原生控件的UI工具包,开发人员可以轻松的创建适用于 Android,iOS 以及 Windows Phone的用户界面.Xamarin.Forms 通过 ...
- Outlook邮箱配置
1.在outlook邮箱里启用pop3 2.接收邮件服务器 pop3-mail.outlook.com 3.发送邮件服务器 smtp-mail.outlook.com 4.其他设置 -->发送服 ...
- Windows系统配置OutLook邮箱教程一
本示例演示Windows系统中OutLook邮箱设置 1.打开控制面板->类型选择小图标->找到Mail(Microsoft OutLook 2016). 2.鼠标左键双击Mail. 3. ...
- Xamarin+Prism开发详解七:Plugin开发与打包测试
有了上章[Xamarin+Prism开发详解六:DependencyService与IPlatformInitializer的关系]的基础,现在来理解Plugin开发就简单了. 本文实例代码地址:ht ...
- 十、.NET使用本地Outlook邮箱指定邮箱用户名和密码发送邮件
十..NET使用本地Outlook邮箱指定邮箱用户名和密码发送邮件 1.添加Microsoft.Office.Interop.Outlook引用 2.封装发送邮件方法 using System; us ...
- 基于python的extract_msg模块提取outlook邮箱保存的msg文件中的附件
笔者保存了一些outlook邮箱中保存的一些msg格式的邮件文件,现需要将其中的附件提取出来, 当然直接在outlook中就可以另存附件,但outlook默认是不支持批量提取邮件中的附件的 思考过几种 ...
- Xamarin+Prism开发之.net standard化
前面[Visual Studio 2017创建.net standard类库编译出错原因]已经解决.net standard类库的编译问题,现在可以正式进入主题了.作为.net 跨平台开发者也得跟上时 ...
随机推荐
- Html Agility Pack 解析Html
Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面 用Fir ...
- 支持 .NET Core 的 Memcached 客户端 EnyimMemcachedCore
1. 介绍 EnyimMemcachedCore 是一个支持 .NET Core 的 Memcached 客户端,是从 EnyimMemcached 迁移至 .NET Core的,源代码托管在 Git ...
- TSQL Identity 用法全解
Identity是标识值,在SQL Server中,有ID列,ID属性,ID值,ID列的值等术语. Identity属性是指在创建Table时,为列指定的Identity属性,其语法是:column_ ...
- node-sass 安装失败的解决措施
在测试gulp-webapp的时候遇到了styles不能被正常编译的问题,究其原因是node-sass没有被正常安装. 根本原因是国内网络的原因. 最终的解决方法是通过淘宝的npm镜像安装node-s ...
- Xamarin+Prism开发详解五:页面布局基础知识
说实在的研究Xamarin到现在,自己就没设计出一款好的UI,基本都在研究后台逻辑之类的!作为Xamarin爱好者,一些简单的页面布局知识还是必备的. 布局常见标签: StackLayout Abso ...
- 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中
#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...
- 【干货分享】流程DEMO-出差申请单
流程名: 出差申请 业务描述: 员工出差前发起流程申请,流程发起时,会检查预算,如果预算不够,将不允许发起费用申请,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金额的预算. ...
- iOS中支付宝集成
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
- [转]NopCommerce How to add a menu item into the administration area from a plugin
本文转自:http://docs.nopcommerce.com/display/nc/How+to+code+my+own+shipping+rate+computation+method Go t ...
- springMvc的日期转换之二
方式一:使用@InitBinder注解实现日期转换 前台页面: 后台打印: 方式二:处理多种日期格式类型之间的转换 采用方式:由于binder.registerCustomEditor(Date.cl ...