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可以一次性实现。
https://msgraph.blob.core.windows.net/graphdocuments/zh-cn/authorization/images/MSGraph_DevStack_v2Auth.png
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)
温馨提醒:
在注册的应用ID,ADAL一样可以使用登录,不过只限管理员和已经授权给这个应用的用户.(如果用户登录不了,可以先使用MSAL类库弹出授权页面授权,然后再使用ADAL就可以登录了。)
Token
通过ADAL或者MSAL类库取得的JWT IDToken是可以解析的,解析之后的数据如下:
两个类库取得的RefreshToken都是存储在应用相关文件夹里面,具体地址如下:
UWP
private static void DefaultTokenCache_BeforeAccess(TokenCacheNotificationArgs args)
{
try
{
var localSettings = ApplicationData.Current.LocalSettings; localSettings.CreateContainer(LocalSettingsContainerName, ApplicationDataCreateDisposition.Always); byte[] state = LocalSettingsHelper.GetCacheValue(localSettings.Containers.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类库还是足够的。
页:
[1]